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

> TypeScript من البداية للنهاية: إنشاء إطلاق LaunchLab، والشراء والبيع على منحنى الربط، والتخرج إلى مجمع CPMM، وجمع رسوم المنشئ.

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

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

<Info>
  **بيان الإصدار.**

  * SDK: `@raydium-io/raydium-sdk-v2@0.2.42-alpha`
  * Cluster: Solana `mainnet-beta`
  * معرّف البرنامج: انظر [`reference/program-addresses`](/ar/reference/program-addresses)
  * آخر تحقق: 2026-04

  ثبّت إصدار SDK في ملف `package.json` الخاص بك. واجهة منحنى الربط تطورت بين الإصدارات الثانوية.
</Info>

## الإعداد

العروض التوضيحية هنا تعكس الملفات في [`raydium-sdk-V2-demo/src/launchpad`](https://github.com/raydium-io/raydium-sdk-V2-demo/tree/master/src/launchpad). يتبع التمهيد ملف [`config.ts.template`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/config.ts.template) في مستودع العروض التوضيحية:

```ts theme={null}
import { Connection, Keypair, clusterApiUrl, PublicKey } from "@solana/web3.js";
import { Raydium, TxVersion } from "@raydium-io/raydium-sdk-v2";
import BN from "bn.js";
import fs from "node:fs";

const connection = new Connection(process.env.RPC_URL ?? clusterApiUrl("mainnet-beta"));
const owner = Keypair.fromSecretKey(
  new Uint8Array(JSON.parse(fs.readFileSync(process.env.KEYPAIR!, "utf8"))),
);
const raydium = await Raydium.load({
  owner,
  connection,
  cluster: "mainnet",
  disableFeatureCheck: true,
  blockhashCommitment: "finalized",
});
export const txVersion = TxVersion.V0;
```

## إنشاء إطلاق

المصدر: [`src/launchpad/createMint.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/launchpad/createMint.ts) (و[`createBonkMintApi.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/launchpad/createBonkMintApi.ts) لمتغير Bonk المدفوع بواسطة API)

```ts theme={null}
import { NATIVE_MINT } from "@solana/spl-token";

const { execute, extInfo } = await raydium.launchpad.createLaunchpad({
  programId: /* معرّف برنامج LaunchLab من reference/program-addresses */,
  // بيانات رمز جديد لرمز الأساس:
  name:   "Example Token",
  symbol: "EXMPL",
  uri:    "https://example.com/metadata.json",
  decimals: 6,

  // معاملات المنحنى:
  curveType: 0,                                      // 0 = تربيعي
  supply:    new BN(1_000_000_000).mul(new BN(10).pow(new BN(6))), // 1B أساسي (6 ديسيمال)
  graduationFractionBps: 8000,                       // 80% → التخرج
  initialK:  new BN("40"),                           // معامل شكل المنحنى

  // جانب الاقتباس:
  quoteMint: NATIVE_MINT,                            // WSOL
  openTime:  new BN(Math.floor(Date.now() / 1000) + 60),  // يفتح خلال 1 دقيقة

  // سياسة الرسوم:
  fees: {
    buyNumerator:   new BN(100),                     // 1.00%
    buyDenominator: new BN(10_000),
    sellNumerator:  new BN(100),
    sellDenominator: new BN(10_000),
    lpShare:         new BN(60),
    creatorShare:    new BN(20),
    protocolShare:   new BN(20),
    totalShare:      new BN(100),
  },

  postGraduationLpPolicy: "burn",                    // "burn" | "lock" | "toCreator"

  txVersion: TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
console.log("Launch:", extInfo.launchState.toBase58());
console.log("Base mint:", extInfo.baseMint.toBase58());
console.log("Create tx:", txId);
```

ملاحظات:

* `initialK` هو عامل القياس لمنحنى التربيعي. اضبطه للوصول إلى سعر افتتاح معين في CPMM عند التخرج. انظر [`products/launchlab/bonding-curve`](/ar/products/launchlab/bonding-curve) للاشتقاق.
* يتعامل SDK مع إنشاء رمز الأساس وPDA البيانات الوصفية وكلا المستودعين في معاملة واحدة. قد يتجاوز 1232 بايت إذا كان عنوان البيانات الوصفية طويلاً؛ في تلك الحالة ينقسم SDK إلى معاملتين.
* بعد `Initialize`، لا يمكن تداول الإطلاق حتى `openTime`. عيّن `openTime` قبل دقيقة أو دقيقتين لإعطاء صائدي المستقبلات فرصة أقل لالتقاط أول عملية شراء.

## جلب حالة الإطلاق

```ts theme={null}
const launchId = new PublicKey("<LAUNCH_STATE>");

const launch = await raydium.launchpad.getLaunchById({ launchId });
console.log("Status:", ["Active","Graduated","Cancelled"][launch.status]);
console.log("Base sold:", launch.baseSold.toString(),
            "/", launch.baseSupplyMax.toString());
console.log("Quote collected:", launch.quoteReserveReal.toString(),
            "target:", launch.quoteReserveTarget.toString());
if (launch.status === 1) {
  console.log("Post-graduation CPMM pool:", launch.cpmmPoolState.toBase58());
}
```

يعيد `getLaunchById` المفكك `LaunchState` بالإضافة إلى جزء "التقدم نحو التخرج" المحسوب كـ `Decimal`.

## الشراء — إدخال اقتباس دقيق

المصدر: [`src/launchpad/buy.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/launchpad/buy.ts)

```ts theme={null}
const quoteIn        = new BN(1).mul(new BN(10).pow(new BN(9)));  // 1 SOL
const minimumBaseOut = new BN(0);  // قبول أي شيء؛ شدّد للإنتاج

// معاينة الاقتباس خارج السلسلة بحيث يمكن لواجهة المستخدم عرض base_out المتوقع:
const preview = raydium.launchpad.computeBuyBase({
  launchState: launch,
  quoteIn,
});
console.log("Expected base_out:", preview.baseOut.toString(),
            "price impact:", preview.priceImpact.toString());

const { execute } = await raydium.launchpad.buyExactIn({
  launchInfo: launch,
  quoteIn,
  minimumBaseOut,
  txVersion: TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
console.log("Buy tx:", txId);
```

`computeBuyBase` يعكس محلل Newton على السلسلة (منحنى تربيعي) أو معكوس CPMM بصيغة مغلقة (curve\_type 1). استخدمه لملء حقل واجهة المستخدم "تستقبل".

## الشراء — إخراج أساسي دقيق

```ts theme={null}
const baseOut         = new BN(1_000_000).mul(new BN(10).pow(new BN(6)));  // 1M أساسي
const maximumQuoteIn  = new BN(2).mul(new BN(10).pow(new BN(9)));          // حد أقصى 2 SOL

const { execute } = await raydium.launchpad.buyExactOut({
  launchInfo: launch,
  baseOut,
  maximumQuoteIn,
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
```

مفيد لواجهات المستخدم "اشتر X من الرموز بالضبط". يرفض مع `ExceededSlippage` إذا تحرك المنحنى بحيث يتجاوز متطلب الاقتباس الآن `maximumQuoteIn`.

## البيع

المصدر: [`src/launchpad/sell.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/launchpad/sell.ts)

```ts theme={null}
const baseIn           = new BN(500_000).mul(new BN(10).pow(new BN(6)));  // 0.5M أساسي
const minimumQuoteOut  = new BN(0);

const { execute } = await raydium.launchpad.sellExactIn({
  launchInfo: launch,
  baseIn,
  minimumQuoteOut,
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
```

مسار البيع في المنحنى متماثل مع مسار الشراء: تقليل `base_sold` بمقدار `baseIn` يعيد `quote_out` مساوياً للمنطقة المتكاملة تحت المنحنى بين `base_sold − baseIn` و `base_sold`، مطروحاً منها رسم البيع.

## التخرج التلقائي عند شراء عبور الحد الأدنى

يربط SDK تعليمة `Graduate` داخل معاملة `buy*` عندما يكتشف أن حالة ما بعد الشراء ستعبر الحد الأدنى:

```ts theme={null}
const { execute, willGraduate } = await raydium.launchpad.buyExactIn({
  launchInfo: launch,
  quoteIn: new BN(100).mul(new BN(10).pow(new BN(9))),    // شراء كبير
  minimumBaseOut: new BN(0),
  txVersion: TxVersion.V0,
  autoGraduate: true,                                      // الإعداد الافتراضي
});

if (willGraduate) {
  console.log("This buy will trigger graduation.");
}

const { txId } = await execute({ sendAndConfirm: true });
```

لأن `Graduate` غير مرخصة، يمكن لأي شخص (بما في ذلك بوت MEV) أن يتسابق للهبوط أول `Graduate` بعد عبور الحد الأدنى — عادة ثوان لاحقة، وليس دقائق. الهابط الأول فقط يدفع إيجار حسابات مجمع CPMM؛ لا يحصلون على أي فائدة أخرى.

## `Graduate` يدوي

إذا كان `autoGraduate` معطلاً أو فشلت معاملة عبور الحد الأدنى، يمكنك إطلاق التخرج بشكل منفصل:

```ts theme={null}
const { execute } = await raydium.launchpad.graduate({
  launchInfo: launch,
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
```

يرجع `NotAtThreshold` إذا كان `quote_reserve_real < quote_reserve_target` عند وقت الإرسال. آمن للإعادة — محاولة `Graduate` الثانية بعد النجاح ترجع `NotActive`.

## جمع رسوم المنشئ

المصدر: [`src/launchpad/claimCreatorFee.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/launchpad/claimCreatorFee.ts) (رمز واحد) و[`collectAllCreatorFees.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/launchpad/collectAllCreatorFees.ts) (مجمّع)

```ts theme={null}
const { execute } = await raydium.launchpad.collectCreatorFees({
  launchInfo: launch,
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
```

ينقل مبلغ العداد المتراكم لرسم المنشئ إلى ATA للمنشئ على رمز الاقتباس. قابل للاستدعاء قبل أو بعد التخرج؛ استخدمه بشكل دوري بدلاً من الانتظار حتى تتراكم رصيد ضخم.

## تتبع إطلاق عبر دورة حياته

بالجمع، قد يبدو سكريبت المراقبة كالتالي:

```ts theme={null}
async function watch(launchId: PublicKey) {
  while (true) {
    const launch = await raydium.launchpad.getLaunchById({ launchId });
    const progress =
      Number(launch.quoteReserveReal) /
      Number(launch.quoteReserveTarget);

    console.log(
      `status=${["Active","Graduated","Cancelled"][launch.status]}`,
      `progress=${(progress * 100).toFixed(2)}%`,
      `num_buys=${launch.stateData.numBuys}`,
    );

    if (launch.status === 1) {
      console.log("Graduated to CPMM pool:", launch.cpmmPoolState.toBase58());
      break;
    }
    await new Promise(r => setTimeout(r, 10_000));
  }
}
```

## Rust CPI

استدعاء LaunchLab من برنامج Anchor الخاص بك نادر (معظم تكاملات الإطلاق هي TS فقط). إذا فعلت ذلك، فإن البرنامج يشحن صندوق Anchor `raydium_launchlab` مع `cpi::accounts::Buy` و `cpi::accounts::Sell` وغيرها — النمط يعكس أمثلة CPMM / CLMM CPI. انظر [`sdk-api/rust-cpi`](/ar/sdk-api/rust-cpi) للحصول على نموذج معمم بمجرد ملء الموقع.

## الأخطاء الشائعة

* **حساب تقسيم الرسوم معطل بـ one-off.** إذا لم يكن `total_share` مساوياً بالضبط `lp_share + creator_share + protocol_share`، فإن `Initialize` يرجع `InvalidFeeShares`. عيّن `totalShare` مساوياً للمجموع.
* **استخدام رمز اقتباس غير مسموح.** `launch_config.allowed_quote_mints` قائمة ثابتة؛ تمرير أي رمز آخر يرجع. تحقق مع `raydium.launchpad.getConfig()` أولاً.
* **حجم البيانات الوصفية.** سلاسل `uri` الطويلة تدفع Metaplex CPI فوق الميزانية. احتفظ بـ `uri` تحت \~200 حرف — معظم البيانات الوصفية JSON المستضافة على CDN تناسب بسهولة.
* **سباق التخرج.** الروبوتات الآلية تراقب `quote_reserve_real` وتسبق `Graduate` في فتحة أو اثنتين من عبور الحد الأدنى. هذا حميد — إنه يكلفهم الإيجار فقط — لكن هذا يعني أن واجهة المستخدم الخاصة بك يجب أن تعامل انتقالات `status` كأحداث سريعة.

## الخطوات التالية

* [`products/launchlab/bonding-curve`](/ar/products/launchlab/bonding-curve) — رياضيات المنحنى.
* [`products/cpmm/code-demos`](/ar/products/cpmm/code-demos) — ماذا تفعل مع المجمع الناتج.
* [`user-flows/launch-token-launchlab`](/ar/user-flows/launch-token-launchlab) — دليل إطلاق رمز من البداية للنهاية، بما في ذلك الخطوات خارج السلسلة.

المصادر:

* [Raydium SDK v2](https://github.com/raydium-io/raydium-sdk-V2)
* مصدر برنامج Raydium LaunchLab
