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

# البرامج و Anchor

> كيفية نشر برامج Solana وترقيتها، ما الذي يضيفه إطار عمل Anchor على نموذج Solana الأصلي، وكيفية قراءة IDL الخاص بـ Raydium لإنشاء عملائك الخاصين.

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

  [عرض النسخة الإنجليزية →](/solana-fundamentals/programs-and-anchor)
</Info>

<Info>
  برامج Raydium الأحدث (CPMM و CLMM و Farm v6 و LaunchLab) مكتوبة بـ **Anchor** — إطار عمل Rust يبني على نموذج برنامج Solana الأصلي لتوفير التحقق من الحسابات ومعالجة الأخطاء و IDL (وصف الواجهة). يسبق AMM v4 والمزارع الأقدم Anchor. فهم كلا النموذجين يساعدك على قراءة الكود وإنشاء عملاء من IDL وتصحيح الأخطاء غير المتوقعة.
</Info>

## نموذج نشر البرنامج

كل برنامج Solana يعيش في `Pubkey`. يتم تخزين bytecode البرنامج في حساب **قابل للتنفيذ** مملوك لـ **BPF Upgradable Loader** (`BPFLoaderUpgradeab1e11111111111111111111111`).

يتكون نشر البرنامج من ثلاثة حسابات:

1. **حساب البرنامج**: حساب بيانات وصفية صغير في معرّف البرنامج. المالك: BPF Upgradable Loader.
2. **حساب ProgramData**: يحتفظ بـ bytecode الفعلي. مشتق من `[program_id, "programdata"]`.
3. **حساب Buffer** (مؤقت): يحتفظ بـ bytecode جديد أثناء الترقية. يتم حذفه بعد الترقية.

حساب ProgramData له **سلطة ترقية** — مفتاح يمكنه استبدال bytecode بنسخة جديدة. سلطة ترقية Raydium هي multisig خلف timelock مدته 24 ساعة؛ انظر [`security/admin-and-multisig`](/ar/security/admin-and-multisig).

### التحقق من برنامج مُنشّر

للتأكد من أن ما هو على السلسلة يطابق ما هو في المصدر المعتمد من التدقيق:

```bash theme={null}
# تفريغ البرنامج من mainnet
solana program dump CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C cpmm-onchain.so

# البناء من مصدر معروف
cargo build-sbf --manifest-path raydium-cp-swap/programs/cp-swap/Cargo.toml
cp target/deploy/raydium_cp_swap.so cpmm-source.so

# المقارنة
sha256sum cpmm-onchain.so cpmm-source.so
```

تثبت الـ hashes المتطابقة أنك تتفاعل مع المصدر الذي تعتقد أنك تتفاعل معه. تنشر Raydium تعليمات البناء المُتحقق منها في ملاحظات الإصدار.

## Anchor: إطار عمل فوق Solana

برامج Solana الخام هي دوال Rust بهذا التوقيع:

```rust theme={null}
pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    // تحليل instruction_data يدويًا
    // التحقق من الحسابات يدويًا
    // فك تسلسل بيانات الحساب يدويًا
    // التحقق من أعلام signer/writable يدويًا
    // ... ثم القيام بالعمل الفعلي
    Ok(())
}
```

يلف Anchor كل الكود المتكرر ويسمح لك بالكتابة:

```rust theme={null}
#[program]
pub mod cpmm {
    use super::*;

    pub fn swap_base_input(
        ctx: Context<Swap>,       // Anchor 1.0: one lifetime.
                                  // Under 0.3x this was Context<'_, '_, '_, '_, Swap>.
        amount_in: u64,
        min_out: u64,
    ) -> Result<()> {
        // فقط منطق الأعمال — ctx مُتحقق منه مسبقًا
        Ok(())
    }
}

#[derive(Accounts)]
pub struct Swap<'info> {
    pub payer: Signer<'info>,
    pub amm_config: Account<'info, AmmConfig>,
    #[account(mut, seeds = [b"pool", amm_config.key().as_ref()], bump)]
    pub pool_state: AccountLoader<'info, PoolState>,
    #[account(mut)]
    pub input_vault: Box<Account<'info, TokenAccount>>,
    // ... حسابات إضافية
}
```

يقوم Anchor بـ:

* إنشاء **discriminator** حتمي بـ 8 بايتات لكل تعليمة ولكل نوع حساب.
* التحقق من قيود الحساب (المالك والـ seeds والـ writable والـ signer ومطابقة الـ mint ومطابقة برنامج الرموز) قبل تشغيل الكود الخاص بك.
* إنشاء **IDL** — ملف وصف الواجهة الذي يستخدمه العملاء لاستدعاء البرنامج.
* يأتي مع مكتبة عميل Rust و TypeScript و Python.

### discriminator بـ 8 بايتات

كل حساب Anchor وكل تعليمة Anchor تبدأ بـ discriminator بـ 8 بايتات — أول 8 بايتات من SHA-256 لسلسلة ثابتة:

```
Account discriminator:     sha256("account:PoolState")[0..8]
Instruction discriminator: sha256("global:swap_base_input")[0..8]
```

عند استدعاء تعليمة Anchor، أول 8 بايتات من بيانات التعليمة هي هذا discriminator؛ يقوم Anchor بالتوجيه إلى المعالج الصحيح من خلال البحث عنها.

عند قراءة حساب Anchor، أول 8 بايتات تخبرك بنوعه — حاسم لأدوات مثل `getProgramAccounts` التي تعدد جميع الحسابات من نوع معين.

### الأخطاء

تحدد برامج Anchor الأخطاء عبر `#[error_code]`:

```rust theme={null}
#[error_code]
pub enum ErrorCode {
    #[msg("Slippage tolerance exceeded")]
    SlippageExceeded,
    #[msg("Pool is disabled")]
    PoolDisabled,
    // ...
}
```

يقوم Anchor بتعيين هذه الأكواد الرقمية تلقائيًا بدءًا من 6000 (0x1770). جدول أكواد الأخطاء الكامل لـ Raydium موجود في [`reference/error-codes`](/ar/reference/error-codes).

## IDL

ملف **IDL** (لغة وصف الواجهة) الخاص بـ Anchor هو وصف JSON لبرنامج: تعليماته وحساباته وأنواعه وأخطاؤه وأحداثه. إنه معادل Ethereum ABI.

تنشر Raydium IDLs لجميع برامج Anchor. جلب مباشر من على السلسلة:

```bash theme={null}
anchor idl fetch CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C -o cpmm.idl.json
```

أو من مصدر SDK: `src/raydium/*/idl/*.json`.

### هيكل IDL

```json theme={null}
{
  "version":      "0.1.0",
  "name":         "raydium_cp_swap",
  "instructions": [ { "name": "swap_base_input", "accounts": [ ... ], "args": [ ... ] }, ... ],
  "accounts":     [ { "name": "PoolState", "type": { ... } }, ... ],
  "types":        [ { "name": "AmmConfig", "type": { ... } }, ... ],
  "errors":       [ { "code": 6000, "name": "SlippageExceeded", "msg": "..." }, ... ],
  "events":       [ { "name": "SwapEvent", "fields": [ ... ] }, ... ]
}
```

### إنشاء عميل من IDL

يقوم CLI `anchor` الخاص بـ Anchor بإنشاء أنواع TypeScript و Rust:

```bash theme={null}
anchor idl build -o target/idl/cpmm.json
# أنواع TypeScript التي تم إنشاؤها تلقائيًا بواسطة ts-client الخاص بـ Anchor
# SDK الخاص بـ Raydium يتضمن هذه بالفعل
```

يمكن لأدوات الجهات الخارجية مثل [Codama](https://github.com/codama-idl/codama) إنشاء عملاء Rust أو Go أو Python أو JavaScript من IDL. (و Codama هو خليفة Kinobi من Metaplex، الذي لم يشحن قط سوى مُصيِّر JavaScript.)

### عندما يكون IDL صديقك

إذا كنت تريد بناء تكامل مخصص لا يمر عبر Raydium SDK:

1. جلب IDL (مباشر من على السلسلة أو من مصدر SDK).
2. البحث عن التعليمة التي تريدها (مثل `swap_base_input`).
3. بناء بيانات التعليمة: discriminator بـ 8 بايتات + الحجج المشفرة.
4. تمرير الحسابات بالترتيب الذي يحدده IDL.

انظر [`sdk-api/anchor-idl`](/ar/sdk-api/anchor-idl) للحصول على أمثلة عملية.

## برامج ما قبل Anchor: AMM v4 و Farm v3/v5

هذه البرامج تسبق Anchor. تستخدم:

* **توزيع التعليمات اليدوي**: علامة `u8` في `instruction_data` مع بيان `match`.
* **التحقق من الحساب اليدوي**: `if accounts[0].owner != &expected_program { ... }`.
* **حجج التعليمات المسلسلة بـ Borsh**: لا توجد discriminator، فقط `instruction_data[1..]`.
* **التخطيط عبر `#[repr(C, packed)]`**: تخطيط ثنائي لهيكل C.

يشحن Raydium SDK v2 تخطيطات TypeScript لتعليمات AMM v4 غير Anchor بحيث يمكن للعملاء الترميز/فك الترميز بدون Anchor:

```ts theme={null}
import { liquidityStateV4Layout, struct, u8, u64 }
  from "@raydium-io/raydium-sdk-v2";
import BN from "bn.js";

// `liquidityStateV4Layout` is exported for decoding AmmInfo. The instruction-data
// layout is internal to the SDK, so declare it yourself with the exported
// marshmallow helpers — note the first field is `instructionId`, not `instruction`.
const swapLayout = struct([u8("instructionId"), u64("amountIn"), u64("minAmountOut")]);

const data = Buffer.alloc(swapLayout.span);
swapLayout.encode(
  { instructionId: 9, amountIn: new BN(1_000_000), minAmountOut: new BN(950_000) },
  data,
);
```

نمط التكامل هو نفسه — فقط لا تحصل على إنشاء Anchor الآلي المدفوع بـ IDL.

## ميكانيكا ترقية البرنامج

فقط `upgrade_authority` الخاص بـ ProgramData يمكنه الترقية. الخطوات:

1. ترجمة bytecode جديد.
2. كتابته إلى حساب buffer (`solana program write-buffer`).
3. تقديم تعليمة ترقية: `BpfLoaderUpgradeable::Upgrade { buffer, program, authority }`.
4. يقوم وقت التشغيل بالاستبدال الذري لـ bytecode البرنامج بمحتويات buffer.

تضع Raydium هذا خلف **timelock مدته 24 ساعة** مُنفذ في إعدادات multisig الخاص بـ Squads. يجب أن تنتظر معاملة الترقية 24 ساعة بعد موافقة multisig قبل التنفيذ. هذا يحمي من الترقيات المستعجلة / المكرهة.

انظر [`security/admin-and-multisig`](/ar/security/admin-and-multisig).

### جعل برنامج غير قابل للتغيير

يمكن تعيين سلطة الترقية إلى `None`، وعند هذه النقطة يصبح البرنامج غير قابل للتغيير بشكل دائم. لم تقم Raydium بهذا لأي منتج — يحتفظ الفريق بالقدرة على دفع إصلاحات الأمان. المقايضة: يجب على المستخدمين الثقة في عملية multisig + timelock.

## البرامج والإيجار

نشر برنامج يستهلك lamports معفاة من الإيجار:

* برنامج بحجم 50 كيلوبايت: \~0.35 SOL في الإيجار.
* برنامج بحجم 200 كيلوبايت: \~1.4 SOL في الإيجار.

إغلاق برنامج (عبر `solana program close`) يعيد lamports. تبقى برامج Raydium نشطة ولا يتم جدولة إغلاقها.

## تصحيح برامج Anchor

### إخراج السجل

يكتب ماكرو `msg!` الخاص بـ Anchor إلى سجل المعاملة. محاكاة معاملة لرؤية السجلات:

```ts theme={null}
const sim = await connection.simulateTransaction(tx);
console.log(sim.value.logs);
```

تتضمن السجلات:

* استدعاء البرنامج (`Program CPMMoo8... invoke [1]`).
* استدعاءات `msg!` من كود البرنامج.
* استهلاك وحدة الحساب (`consumed 137842 of 400000 compute units`).
* نجاح البرنامج أو خطأ.

### أكواد الأخطاء

إذا رمى برنامج Anchor خطأ، يظهر السجل:

```
Program CPMMoo8... failed: custom program error: 0x1770
```

0x1770 = 6000 عشري = أول خطأ Anchor (مثل `SlippageExceeded`). تحقق من مع مصفوفة `errors` الخاصة بـ IDL.

انظر [`reference/error-codes`](/ar/reference/error-codes) لجدول الأخطاء الكامل الخاص بـ Raydium.

### عدم تطابق تخطيط الحساب

إذا مررت الحساب الخاطئ في الفتحة الخاطئة، تعيد ماكروهات التحقق من الحساب الخاصة بـ Anchor أخطاء مثل:

```
AnchorError: AccountNotInitialized. Error Number: 3012
```

أرقام الأخطاء أقل من 6000 هي أخطاء Anchor المدمجة (انظر enum `ErrorCode` الخاص بـ Anchor)؛ الأخطاء ≥6000 هي أكواد البرنامج المخصصة.

## مؤشرات

* [`solana-fundamentals/account-model`](/ar/solana-fundamentals/account-model) — كيف تمتلك البرامج الحسابات.
* [`solana-fundamentals/pdas-and-cpis`](/ar/solana-fundamentals/pdas-and-cpis) — PDAs كما يعلنها Anchor.
* [`sdk-api/anchor-idl`](/ar/sdk-api/anchor-idl) — جلب واستخدام IDLs الخاص بـ Raydium.
* [`reference/program-addresses`](/ar/reference/program-addresses) — معرفات البرامج.
* [`reference/error-codes`](/ar/reference/error-codes) — مرجع رمز الخطأ.
* [`security/admin-and-multisig`](/ar/security/admin-and-multisig) — التحكم في سلطات الترقية.

المصادر:

* [وثائق Anchor](https://www.anchor-lang.com/docs).
* [نشر برنامج Solana](https://solana.com/docs/programs/deploying).
* IDLs الخاص بـ Raydium (منشور في SDK `src/raydium/*/idl/*.json`).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.