هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
CPI (“cross-program invocation” أو استدعاء البرنامج المتقاطع) هي الآلية التي يستدعي بها برنامج Solana واحد برنامجًا آخر. تشحن معظم برامج Raydium مع crate غلاف CPI قائم على Anchor يجعل موقع الاستدعاء يبدو مثل استدعاء دالة مكتوبة بشكل صحيح، مع هياكل حسابات لها أسماء حقول تم التحقق منها ومساعدات
cpi::<ix>(). توثق هذه الصفحة النمط العام مرة واحدة، ثم الاختلافات لكل برنامج. للحصول على TypeScript قابل للتشغيل، انظر صفحة code-demos في فصل كل منتج.أي نمط ينطبق على أي برنامج
إذا كنت تدمج CPMM أو CLMM أو LaunchLab، اقرأ النمط العام أولاً، ثم انتقل إلى قسم برنامجك للحصول على قائمة الحسابات وأي اختلافات. Farm v6 و AMM v4 مختلفان بما يكفي لضمان قراءة أقسامهما بشكل مستقل.
تبعيات Cargo
branch = "master" يتتبع أحدث مصدر منشور؛ ثبّت على rev = "<commit>" محدد إذا كنت بحاجة إلى بناء قابل للتكرار. يُنصح بهذا بمجرد الانتهاء من النماذج الأولية، لأن تغيير تخطيط الحساب في master سيكسر بناءك بدون تحذير.
علم الميزة cpi يجعل crates تجميع السطح فقط من CPI (هياكل الحسابات + المستدعيات) بدلاً من البرنامج الكامل، لذا يبقى ملفك الثنائي صغيراً.
يجب أن يطابق anchor-lang / anchor-spl ما يثبته crate المستهدف:
للحصول على أمثلة CPI عاملة تربط هياكل الحسابات من البداية إلى النهاية، انظر
raydium-io/raydium-cpi-example (يغطي AMM v4 و CPMM و CLMM). أحدث فرع لها هو anchor-0.31.0 — لا يوجد فرع Anchor 1.x حتى الآن، لذا تعامل مع هذا المستودع كمرجع لـ ربط هيكل الحسابات، وليس لتثبيتات الإصدار التي تفرضها هذه الصفحة.
نمط Anchor CPI العام
يشرح هذا القسم CPMM من البداية إلى النهاية كمثال عملي: هيكلAccounts، CpiContext، cpi::<ix>(). يتبع CLMM الشكل المطابق تماماً، مع قائمة حسابات مختلفة ومتطلب remaining-accounts. يتبع LaunchLab نفس الآليات لكن قائمة حساباته تحتوي على عدة حسابات بلا مكافئ في CPMM/CLMM (global_config، platform_config، event_authority، program)، لذا تعامل معها كنفس النمط، وليس نفس الشكل. راجع قسم كل برنامج بدلاً من افتراض أن قائمة الحسابات في هذا الشرح تنطبق مباشرة.
بناء قائمة الحسابات
كل CPI من Raydium يتطلب هيكلAccounts في البرنامج الذي يستدعيه. حقوله هي أي حسابات تحتاجها تعليماتك، مع محققات على مستوى الحقل؛ ترتيب إعلانها لا يجب أن يطابق ترتيب حسابات تعليمات Raydium الخاصة، لأن عميل IDL الذي تم إنشاؤه يعالجها بالاسم وليس بالموضع:
UncheckedAccount لأن المستدعى (Raydium) يمتلك التحقق. برنامجك الذي يستدعي يتحقق بصرامة فقط من الحسابات التي تمتلكها، مثل ATAs المستخدم و PDAs الخاصة بك. تعليق /// CHECK: يقمع تحذير Anchor حول الفحوصات المفقودة. الاستثناء الوحيد من جانب Raydium هو cpmm_program نفسه: إنه البرنامج الذي يتم استدعاؤه وليس حساب بيانات يتحقق منه Raydium داخلياً، لذا يتم كتابته كـ Program<T> ويحصل على فحص العنوان التلقائي من Anchor بدلاً من فحص /// CHECK: يدوي. هذا الشكل الذي يحتوي على UncheckedAccount في الغالب، حيث يتحقق Raydium من حساباته الخاصة، هو نفسه بالنسبة لـ CLMM و LaunchLab. يفترض هذا المثال أن كلا الـ mints كلاسيكي SPL Token؛ إذا كان أي جانب يمكن أن يكون Token-2022 mint، أضف حقل token_program_2022: Program<'info, anchor_spl::token_2022::Token2022> وأمرره كـ input_token_program/output_token_program لذلك الجانب في استدعاء CPI أدناه بدلاً من token_program.
بناء استدعاء CPI
ينشئ Anchor مساعداً واحداً لكل تعليمة، مع هيكل حسابات CPI (cpi::accounts::Swap، مستعار كـ CpmmSwap أدناه). بخلاف هيكل MyProxySwap الخاص بك أعلاه، أسماء الحقول والترتيب في هذا الهيكل ثابتة بواسطة IDL الخاص بـ raydium-cp-swap ويجب أن تطابق بالضبط:
cpi::swap_base_input يتم إنشاؤه من IDL؛ قائمة حجته تعكس قائمة حجج تعليمات Anchor. كل برنامج Raydium مؤكد قائم على Anchor (CPMM، CLMM، LaunchLab) ينشئ مساعدات cpi::<ix>() بنفس الطريقة، مع تطابق اسم الدالة مع اسم التعليمة بصيغة snake_case. ما إذا كان هذا يمتد إلى Farm v6 غير مؤكد؛ راجع قسمه.
بذور الموقّع (CPI موقّع بـ PDA)
عندما يوقّع برنامجك على CPI نيابة عن PDA (شائع للخزائن والضمانات، إلخ)، استخدمCpiContext::new_with_signer:
authority (أو دور موقّع مشابه)، يتحقق وقت تشغيل Solana من أن PDA يوقّع عبر هذه البذور.
الحسابات المتبقية
بعض تعليمات Raydium تأخذ حسابات متبقية، قائمة بطول متغير مُلحقة بعد الحسابات الثابتة. مساعدات CPI الخاصة بـ Anchor لا تفحص نوع الحسابات المتبقية؛ مررها عبر.with_remaining_accounts(...):
- CLMM
SwapV2: مصفوفات التجزئة، مرتبة اتجاهياً. - Farm v6: أزواج
(reward_vault, user_reward_ata)، لكن فقط من تدفق المكافأة الثاني فما بعده؛ راجع Farm v6 لمعرفة ما يظهره فك تشفير معاملة حقيقية.
تطبيق النمط: CLMM
يتبعSwapV2 النمط العام أعلاه مع قائمة حسابات مختلفة ومتطلب remaining-accounts لمصفوفات التجزئة. وحدة #[program] الخاصة بـ crate مسماة raydium_clmm، وهي أيضاً مسار Rust use الخاص بها.
TickArrayNotFound (راجع products/clmm/instructions للحصول على جدول الحسابات الكامل وقائمة الأخطاء). مررها في اتجاه المشي السعري: أول مصفوفة في اتجاه المبادلة أولاً.
تطبيق النمط: LaunchLab
LaunchLab مبني على Anchor ومنشور عبر IDL:raydium_launchpad/raydium_launchpad.json في مستودع raydium-idl العام. معرّف البيانات الوصفية الداخلي لهذا IDL هو raydium_launchpad، وهو اسم تقني للبرنامج الأساسي وليس اسماً بديلاً للمنتج. بخلاف CPMM و CLMM، الكود المصدري للبرنامج نفسه غير متاح للعموم (انظر reference/program-addresses). لا توجد تبعية git = "..." لتوجيه Cargo إليها، ولا يوجد مصدر للتحقق من مسار Rust use الفعلي للـ crate.
أنشئ الربطات من IDL المنشور باستخدام ماكرو Anchor declare_program!. احفظ ملف JSON الخاص بـ IDL باسم idls/raydium_launchpad.json في crate الخاص بك (يبحث Cargo عن مجلد idls/ نسبة إلى CARGO_MANIFEST_DIR)، ثم declare_program!(raydium_launchpad); ينشئ هياكل raydium_launchpad::cpi::accounts::<Ix> ودوال cpi::<ix>() مباشرة من IDL، بدون الحاجة إلى مصدر البرنامج. اسم هيكل الحسابات المُنشأ هو دائماً اسم التعليمة بصيغة PascalCase (buy_exact_in → BuyExactIn)، وأسماء الحقول تطابق أسماء الحسابات في IDL بالضبط، نفس قائمة الحسابات المستخدمة بالفعل في MyProxyBuy أدناه.
شكل CPI يتبع النمط العام. قائمة الحسابات والمعاملات أدناه تأتي من تعليمة buy_exact_in في IDL على السلسلة، وليس من products/launchlab/instructions.mdx:
pool_state.migrate_type، والذي تقول products/launchlab/accounts.mdx أنه يُعيّن في وقت Initialize. قائمة حسابات CPI الخاصة بك يجب أن تكون مُعدّة لأي منهما، أو تحتاج إلى قراءة migrate_type من PoolState أولاً والتفرع.
نشر الأخطاء
كل برنامج Raydium مبني على Anchor يُرجع enum أخطاء خاص به؛ Anchor يلفّه، لذا برنامجك الذي يستدعي يرى الأخطاء كـErr(ProgramError::Custom(code)). للتعامل مع أخطاء محددة:
raydium_clmm::error::ErrorCode لـ CLMM، وهكذا). أرقام رموز الأخطاء مستقرة وفقاً لسياسة IDL (sdk-api/anchor-idl)، لذا يمكنك الاختبار مقابل رموز محددة بمقارنة القيمة الرقمية. جداول الأخطاء الكاملة: CPMM، CLMM، AMM v4، Farm v6، و LaunchLab.
ميزانية الحساب في CPIs المركبة
لكل إطار CPI تكلفة عامة، واستهلاك CU الخاص بالمستدعى يتراكم فوق استهلاكك، لذا معاملة تستدعي Raydium من داخل برنامجك تحتاج إلى ميزانية حساب صريحة بدلاً من الاعتماد على الحد الافتراضي 200k CU.مقاس، وليس مقدّر.
swap_base_input في CPMM على mainnet يستهلك ~23,000 CU في برنامج CPMM نفسه — تم أخذ عينات في 2026-09-09 عبر ثماني مبادلات مباشرة على مجموعة عالية الحجم (22,721–23,052)، مقروءة من سطر السجل Program CPMMoo8… consumed N of M compute units. للمقارنة: AMM v4 swap ~26,000؛ CLMM swap ~41,000؛ CLMM swap_v2 ~48,000 (43,838–52,887)، يرتفع مع كل عبور tick.نسخة سابقة من هذه الصفحة أبلغت عن ~47,700 CU لـ proxy-swap CPI. كان هذا الرقم المعاملة بأكملها (computeUnitsConsumed)، والذي يشمل برنامجك الخاص، إطار CPI وأي إعداد ATA — وليس تكلفة المستدعى. كلاهما مفيد، لكنهما ليسا نفس الرقم، لذا قارن مثل مع مثل. قس معاملتك الخاصة بدلاً من وضع ميزانية من أي من الرقمين.remaining_accounts، مضيفاً CU لكل مصفوفة)، لكن فقط الرقم CPMM أعلاه هو قيمة مقاسة. اضبط دائماً تعليمة ComputeBudgetProgram::set_compute_unit_limit(...) صريحة بحجم من قياسك الخاص، وليس رقماً منسوخاً من التوثيق، لأن حد 200k CU الافتراضي سيستنزف بصمت وتكاليف كل تعليمة تتغير مع ترقية البرامج.
AMM v4: بناء Instruction يدوي
AMM v4 يسبق Anchor وليس لديه crate CPI، مما يجعله البرنامج الوحيد في هذا المستند الذي لا يتبع النمط العام أعلاه. بناءInstruction يدويًا:
products/amm-v4/code-demos للحصول على قائمة الحسابات الكاملة.
Farm v6
استخدم TS SDK إذا كان هذا خياراً لتكاملك.raydium.farm.deposit(...) (انظر products/farm-staking/code-demos) يتم ممارسته من خلال عروض توضيحية حقيقية ولا يعتمد على ما إذا كان crate Anchor موجود لهذا البرنامج.
إذا كنت بحاجة إلى Rust CPI بغض النظر، على سبيل المثال التركيب من برنامج آخر على السلسلة، بناء Instruction يدويًا، بنفس الطريقة كما في AMM v4: اشتق قائمة الحسابات الحقيقية ومميزات التعليمات بشكل مستقل، على سبيل المثال بفك تشفير تخطيطات TypeScript الخاصة بـ SDK (raydium-sdk-V2’s farm module)، فك تشفير المعاملات الحقيقية مباشرة (انظر أدناه)، أو تفريغ وفك تجميع البرنامج المنشور.
لشكل التعليمة بدون معاملات متسق مع استدعاء harvest أو claim، ترتيب الحساب الحقيقي هو بادئة ثابتة (token_program، حساب حالة المزرعة، PDA سلطة الخزن، أول خزن مكافآت PDA، ثاني PDA، المستدعي، و ATA المستدعي لأول mint مكافآت)، متبوعاً بأزواج (reward_vault_i, user_reward_ata_i) في remaining_accounts لكل تدفق مكافآت بعد الأول. اتفاقية الاقتران حقيقية، لكنها تبدأ فقط عند تدفق المكافآت الثاني: خزن وATA تدفق المكافآت الأول حسابات ثابتة، وليست مجاورة لبعضها البعض، وليست جزءاً من remaining_accounts على الإطلاق.
اختبار تدفق CPI
يتطلب التطوير المحلي توفر برامج Raydium في مدقق الاختبار المحلي لديك. ثلاث خيارات:anchor testمع استنساخ البرنامج. يسحب bytecode المنشور من mainnet إلى مدقق الاختبار المحلي؛ انظر استنساخ البرامج إلى مدقق محلي أدناه للحصول على إعداداتAnchor.tomlوشيئين يسبّبان مشاكل في اختبارات إنشاء المجمع تحديداً.- Devnet. تنشر Raydium معظم البرامج على devnet، لكن بـ معرفات برامج مختلفة عن mainnet لكل برنامج (CPMM و CLMM و AMM v4 و Stable AMM و LaunchLab لكل منها عنوان devnet مختلف؛ انظر جدول Devnet في
reference/program-addresses). لا يتم نشر Farm v3/v5/v6 بشكل موثوق على devnet؛ واجهة برمجية حية (https://api-v3-devnet.raydium.io/main/info) توضح الصورة الحالية. إذا استخدمت ثوابتDEVNET_PROGRAM_IDالمضمنة فيraydium_clmm(أو ما يعادلها في صناديق أخرى)، فلا تفترض أن معرف mainnet يعمل أيضاً على devnet. شغّلanchor test --provider.cluster devnetللوصول إلى الكود الحي بمجرد حصولك على العناوين الصحيحة. - نشر محلي. استنسخ مستودعات Raydium (CPMM و CLMM؛ مصدر LaunchLab غير متاح لهذا الخيار) و
anchor deployإلى مدقق محلي. يضيف تكلفة دورة اختبار لكن يتيح لك تعديل المستدعى للتصحيح.
anchor test، أو anchor build أولاً ثم anchor test --skip-build بعده إذا كنت تكرر على ملف الاختبار دون تغيير البرنامج.
استنساخ البرامج إلى مدقق محلي
reference/program-addresses هو مصدر الحقيقة لكل عنوان هنا.
مؤشرات
products/cpmm/code-demos،products/clmm/code-demos،products/amm-v4/code-demos،products/farm-staking/code-demos،products/launchlab/code-demos: أمثلة CPI و TypeScript خاصة بالمنتج.sdk-api/anchor-idl: استرجاع IDL وإعادة إنشاء العميل، بما في ذلك مسار IDL-codegen لـ LaunchLab.integration-guides/cpi-integration: أنماط تكامل أعلى مستوى مثل الضمانات والأقبية وتكوين المجمّع.
- raydium-cp-swap
- raydium-clmm
- raydium-idl: LaunchLab IDL (مصدر البرنامج نفسه مغلق)
- Anchor CPI docs

