الانتقال إلى المحتوى الرئيسي
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
تغطي sdk-api/rust-cpi الآليات منخفضة المستوى لاستدعاء كل برنامج Raydium. هذه الصفحة هي الرفيقة ذات المستوى الأعلى: لماذا ستؤلف Raydium في برنامجك الخاص، أي نمط يناسب حالتك الاستخدام، والغراء الكامل الذي تحتاجه من البداية إلى النهاية.

عندما يكون CPI الأداة الصحيحة

يكون البرنامج المخصص منطقياً عندما تحتاج المبادلة إلى حدوث ذرياً مع تغييرات الحالة الأخرى المسجلة على السلسلة والتي يمكن فقط لبرنامجك إجراؤها. الحالات الشائعة:
  • برامج الأرصدة المحفوظة / أوامر الحد — يودع المستخدم عملة معدنية في أرصدتك المحفوظة، يراقب برنامجك حالة السعر، وعندما يحدث، يقوم برنامجك بمبادلة ذرية من خلال Raydium ويعتمد على حساب المستخدم.
  • كلاء المجمعات — تعليمة واحدة توجه مبادلة من خلال Raydium + DEX واحد أو أكثر، مع جميع الخطوات تحت فحص انزلاق واحد يملكه برنامجك.
  • أقبية الإعادة التلقائية — إيداع رمز LP أو حصة مزرعة في أرصدتك، الأرصدة المحفوظة تجني المكافآت في الجدول الزمني، إعادة الإمداد بالسيولة، إصدار رموز الأسهم.
  • أقبية الإستراتيجية — مراكز LP ذات الرافعة المالية التي تعيد التوازن من خلال المبادلة عبر CLMM؛ المصفّين الذين يغلقون المراكز ويبدلون الضمان في معاملة واحدة.
  • منصات إطلاق الرموز المخصصة مع استحقاق مخصص — يحتفظ برنامجك برموز استحقاق وإصدارات في مجموعة Raydium في الجدول الزمني.
إذا كنت تريد فقط إرسال مبادلة من كود خارج السلسلة، فإن CPI مبالغ فيه — استخدم SDK. CPI يكتسب تعقيده فقط عندما تكون الذرية مع حالتك الخاصة هي المتطلب.

أنماط التكوين

النمط 1: وكيل رقيق

يكشف برنامجك عن تعليمة واحدة تتحقق من بعض السياسات (على سبيل المثال، أزواج العملات المعدنية المدرجة في القائمة البيضاء، خصم الرسوم للمستخدمين المتحققين) ثم التحويل إلى Raydium.
الحالة تعيش في ATAs للمستخدم. برنامجك لا يملك أي رموز. بصمة ثقة سلمية.

النمط 2: أرصدة محفوظة

يملك برنامجك PDA يحتفظ برمز الإدخال للمستخدم. عند تفعيل، يوقع PDA عملية CPI إلى Raydium لمبادلة رصيده الخاص.
التفصيل الحرج: PDA يوقع عبر CpiContext::new_with_signer. انظر بذور موقع PDA.

النمط 3: متعدد الخطوات المركب

يصدر برنامجك عمليات CPI متعددة في تعليمة واحدة، مما يفرض حداً انزلاقياً واحداً عبر كل منها. تحتوي تعليمات مبادلة Raydium على minimum_amount_out خاصة بها، لكنك تعيين تلك إلى 0 (أو حد أدنى جداً) وتفرض حداً أدنى صارماً بنفسك بعد الخطوة الأخيرة.
هذا يمنحك بوابة انعكاسية واحدة للمسار بأكمله. استخدم هذا النمط فقط عندما تثق بأن كل خطوة آمنة من حيث الانزلاق؛ وإلا، دع كل خطوة تفرض حدها الأدنى الخاص.

النمط 4: أرصدة محفوظة / إستراتيجية

يحتفظ برنامجك برموز LP أو حصة مزرعة في PDA. يستدعي الحارس (أو المستخدم) compound()، الذي:
  1. حصاد المكافآت من المزرعة.
  2. مبادلة المكافآت برموز المجموعة (CPI إلى CPMM أو CLMM).
  3. إيداع العائدات مرة أخرى في LP (CPI آخر).
  4. حصة LP الجديدة (CPI آخر).
كل ذلك في معاملة واحدة حتى تتحرك NAV الأرصدة المحفوظة بشكل ذري. ميزانية الحوسبة عادة ما تكون 600k–1M CU؛ جداول البحث عن العناوين إلزامية.

بناء قائمة الحسابات

يعكس Accounts struct للبرنامج الاستدعاء ترتيب حسابات برنامج Raydium، لكن معظم حسابات الجانب Raydium هي UncheckedAccount لأن Raydium يتحقق منها بنفسه. تضيف قيوداً فقط على الحسابات التي تملكها أنت:
عدم التماثل — التحقق الصارم من حساباتك، UncheckedAccount على حسابات Raydium — ليس كسلاً. يتحقق المستقبل من حسابه؛ التحقق المزدوج في المستدعي يحرق CU فقط ويخاطر بالخروج عن التزامن عندما ترسل Raydium حقل تخطيط struct جديداً.

استدعاء CPI نفسه

بذور موقع PDA

تنجح عملية CPI فقط إذا تطابق PDA الذي يتم تمريره كـ authority مع الاشتقاق الذي يدعيه المتصل. يجب أن يتفق الاثنان على:
  1. تسلسل البايتات للبذرة (هنا [b"escrow", user.key().as_ref()]).
  2. الارتطام.
  3. معرف برنامج الاستدعاء (برنامجك، وليس برنامج Raydium).
Raydium لا يهتم من هو المسؤول — يهتم فقط بأن توقيع authority يغطي المعاملة وأن ATA للإدخال يملكه هذا الموقع. التحقق يحدث في anchor_spl::token::transfer: يجب أن يساوي حقل authority الخاص بـ ATA المُوقِّع. خطأ شائع: تمرير user كموقع (ونقل من escrow_input_ata التي يملكها PDA الأرصدة المحفوظة). يرفض برنامج SPL Token مع owner mismatch. اجعل حقل authority يطابق دائماً مالك ATA.

الحسابات المتبقية

تأخذ عدة تعليمات Raydium قائمة بطول متغير من الحسابات المُلحقة بعد الحسابات الثابتة — حسابات متبقية.
  • CLMM SwapV2: 1–8 حسابات TickArrayState لمصفوفات العلامات التي قد تعبرها المبادلة، في اتجاه المبادلة.
  • Farm v6 Deposit / Harvest / Withdraw: أزواج (reward_vault, user_reward_ata)، زوج واحد لكل فتحة مكافأة حية.
  • العملات المعدنية مع Token-2022 transfer-hook: برنامج transfer-hook بالإضافة إلى أي حسابات يحتاجها الخطاف.
لا تتحقق مساعدات Anchor CPI من نوع الحسابات المتبقية. مررها:
الترتيب مهم. بالنسبة لـ CLMM:
بالنسبة لـ farm v6 harvest:
يجب على برنامجك الاستدعاء أن يمرر الحسابات المتبقية التي يتلقاها من العميل دون تغيير. لا تحاول تصفيتها أو إعادة ترتيبها.

ميزانية الحوسبة للاستدعاءات المركبة

تكلفة CPI حوالي 1500 وحدة حوسبة لإطار الاستدعاء نفسه؛ استخدام CU الخاص بـ callee يتراكم فوقها. ميزانية تقريبية لكل CPI من Raydium: أضف 1500 لكل إطار CPI و20000 لنفقات برنامجك الخاص. يحتاج مُعيد التكوين التلقائي الذي يقوم بـ harvest → swap A → swap B → deposit LP → stake LP بسهولة إلى 700k CU. عيّن دائماً ComputeBudgetProgram::set_compute_unit_limit صريح:
سيؤدي الحد الافتراضي 200k CU بصمت إلى الاستنزاف قبل اكتمال استدعاء مركب طويل.

نشر الأخطاء

تعيد برامج Raydium أخطاء Anchor برموز خطأ مستقرة. يرى برنامجك الاستدعاء الأخطاء كـ Err(ProgramError::Custom(code)). انشرها بشكل افتراضي:
أو اعترض على أكواد محددة:
تعيين رمز الخطأ إلى المعنى مستقر لكل سياسة IDL (sdk-api/anchor-idl)؛ الرموز الجديدة تُضاف في النهاية، الرموز الموجودة لا تتغير معانيها أبداً.

مثال عملي كامل: أرصدة محفوظة لأوامر الحد

التدفق:
  1. open_order — يودع المستخدم amount_in من input_mint في PDA الأرصدة المحفوظة؛ تسجيل min_amount_out الهدف والانتهاء.
  2. execute_order — أي شخص (حارس) يستدعي مع حسابات المجموعة الحالية. يتحقق البرنامج من أن الاقتباس الحالي ≥ min_amount_out، ثم CPI Raydium swap ويبقي الإخراج في الأرصدة المحفوظة.
  3. claim — ينسحب المستخدم من الرمز المخرج من الأرصدة المحفوظة.
يدفع الحارس رسوم المعاملة (يحصلون على رسوم حارس في مكان آخر — لم يتم عرضه). يوقع PDA الأرصدة المحفوظة على عملية CPI. يفرض فحص الانزلاق من جانب Raydium و فحص دلتا الأرصدة المحفوظة الخاصة به الحد الأدنى — حزام وحمالة.

الاختبار

سحب برامج Raydium إلى مدقق محلي لاختبارات التكامل (من Anchor.toml):
استنسخ حسابات حالة المجموعة أيضاً بحيث يمكن لاختباراتك تنفيذ المبادلات فعلياً؛ يجلب anchor test من الشبكة الرئيسية عند البدء. انظر sdk-api/rust-cpi.

مزالق محددة للتكوين

إعادة الدخول

Solana ليس لديها إعادة دخول حقيقية — CPI لا يمكنه استدعاء برنامج الأصل مرة أخرى في نفس الاستدعاء. لكن يمكنك بناء نفسك في إعادة دخول منطقية: CPI يقرأ حالتك، ثم يقرأ الكود الخاص بك مرة أخرى على افتراض أن CPI لم يتغيره. بالنسبة لـ Raydium، لا تلمس CPIs حالتك، لذا هذا أقل قلقاً من سياقات التمويل الوميضي على سبيل المثال. لكن إذا كنت تركب Raydium مع بروتوكول إقراض، فكن على علم.

انجراف قابلية الحساب

إذا مرر برنامجك حساباً كـ mut لكن Raydium يتوقع عدم تغييره (أو العكس)، يرفض وقت التشغيل الاستدعاء مع InvalidAccountData. تحقق دائماً من قابلية التغيير المتوقعة لتعليمات Raydium في IDL؛ يفرضها anchor_cp_swap::cpi::accounts::Swap عبر أنواع حقوله.

حقل برنامج Token-2022

قد تكون العملات المعدنية للإدخال والإخراج تحت برامج رموز مختلفة — واحدة SPL Token، واحدة Token-2022. CPI له حقول input_token_program و output_token_program منفصلة لهذا السبب. تحقق دائماً من حقل owner لكل عملة معدنية ووجه البرنامج الصحيح إلى كل فتحة.

معاملات مصدرة

معاملة مركبة تفعل 2+ Raydium CPIs بالإضافة إلى إنشاء ATA نادراً ما تناسب معاملة وراثية (v0-without-LUT). استخدم V0 مع جداول البحث عن العناوين؛ اسحب LUTs العام Raydium عبر raydium.getRaydiumLutAddresses().

المؤشرات

المصادر: