هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
لافتة الإصدار. جميع العروض التوضيحية تستهدف
@raydium-io/raydium-sdk-v2@0.2.42-alpha على شبكة Solana mainnet-beta، تم التحقق منها في أبريل 2026. تأتي معرّفات البرامج من reference/program-addresses عبر SDK.الإعداد
raydium-sdk-V2-demo/src/clmm؛ ورابط GitHub مذكور بجانب كل قسم. يتبع الإعداد الأولي ملف config.ts.template الخاص بمستودع العروض التوضيحية (المصدر) — يُنصح باستخدام disableFeatureCheck: true في أي تكامل غير بسيط:
إنشاء pool من نوع CLMM
المصدر:src/clmm/createPool.ts
- ترتيب
mint1/mint2وفق الترتيب البايتي قبل الاشتقاق. - حساب
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - إنشاء حسابَي
observationوtick_array_bitmap_extension. - دفع رسوم إنشاء pool المحددة في
ammConfig.
فتح مركز ضمن نطاق سعري محدد
المصدر:src/clmm/createPosition.ts
InitTickArray إذا كانت أي منها غير مُهيَّأة.
زيادة السيولة على مركز قائم
المصدر:src/clmm/increaseLiquidity.ts
تقليص السيولة (مع تحصيل الرسوم في آنٍ واحد)
المصدر:src/clmm/decreaseLiquidity.ts وsrc/clmm/closePosition.ts
decreaseLiquidity مع تمرير liquidity = new BN(0). الأثر الجانبي للتعليمة هو تسوية tokens_fees_owed_{0,1} وتحويلها خارجًا.
لإغلاق المركز كليًا بعد تصفير السيولة والرسوم، مرّر closePosition: true في آخر استدعاء لـdecreaseLiquidity. سيضيف SDK تعليمة ClosePosition ويحرق NFT.
تحصيل المكافآت
المصدر:src/clmm/harvestAllRewards.ts
harvestAllRewards على كل مركز في كل pool يُمرَّر إليها، وتجمع تعليمات CollectReward (وأي UpdateRewardInfos) في دُفعات، وتوزعها على معاملات متعددة عند الحاجة.
Swap (مبادلة)
المصدر:src/clmm/swap.ts
computeAmountOutFormat خريطة الـ tick خارج السلسلة باستخدام المنطق ذاته المعتمد في البرنامج على السلسلة، وتُعيد:
- الكمية المتوقعة ناتجةً عن العملية،
- الحد الأدنى للكمية الناتجة بعد احتساب slippage،
- قائمة بحسابات مصفوفات tick التي ستمسّها عملية swap الفعلية (
remainingAccounts).
remainingAccounts المُعادة من المحاكاة: إن كانت أقل من اللازم، ستعود العملية بخطأ TickArrayNotFound في منتصف المسير؛ وإن كانت قديمة، فهذا هدر لموارد الحساب.
إنشاء pool من نوع CLMM قابل للتخصيص
createCustomizablePool هو نقطة الدخول الجديدة التي تتيح ضبط الرسوم الديناميكية وخيار الرسوم أحادية الجانب عند إنشاء pool. يأخذ نفس معاملات createPool مع ثلاثة إضافات:
createPool عملها للمسار الافتراضي الذي لا يحتاج رسومًا ديناميكية أو أوامر حد أو تخصيصًا إضافيًا. استخدم createCustomizablePool كلما احتجت إلى أي من الخيارات الثلاثة الجديدة. راجع products/clmm/instructions للاطلاع على قائمة الحسابات على السلسلة.
أوامر الحد (Limit orders)
يضع أمر الحد مدخلات المستخدم عند tick واحد ويُنفَّذ وفق مبدأ FIFO عندما تعبر عملية swap ذلك الـ tick. تُرسَل المخرجات إلى ATA الخاص بالمالك عند وقت التسوية؛ ولا يحتاج المالك أن يكون متصلًا بالشبكة لتنفيذ أمره.فتح أمر حد
LimitOrderState من (pool, owner, tick, nonce)، ويزيد LimitOrderNonce الخاص بكل زوج (pool, owner)، ويدرج الأمر في مجموعة FIFO عند ذلك الـ tick.
زيادة / تقليص أمر مفتوح
decreaseLimitOrder سحب إلا من الجزء غير المنفَّذ من الأمر؛ أما الجزء المنفَّذ فيظل مقيدًا حتى وقت التسوية. تعود كلتا التعليمتين بخطأ InvalidOrderPhase إذا كان الأمر قد اكتمل تنفيذه بالكامل.
تسوية أمر مكتمل التنفيذ
settleLimitOrder النسبة unfilled_ratio_x64 الخاصة بالأمر مقابل متتبع المجموعة، وتحسب المخرجات المنفَّذة، ثم تحولها إلى ATA المالك. يمكن للمالك استدعاء هذه الدالة بنفسه؛ كما يمكن لـlimit_order_admin (وهو حارس تشغيلي خارج السلسلة) استدعاؤها نيابةً عن المالك — والمخرجات تذهب إلى المالك في كلتا الحالتين.
لإغلاق الأوامر المُسوَّاة بالكامل واسترداد الإيجار، استخدم closeLimitOrder (لأمر واحد) أو closeAllLimitOrder (دُفعي). ولتسوية عدة أوامر دفعةً واحدة، تحشو settleAllLimitOrder أكبر عدد ممكن من استدعاءات SettleLimitOrder في معاملة واحدة من نوع v0.
عرض الأوامر المعلّقة لمحفظة ما (خارج السلسلة)
totalAmount / filledAmount / pendingSettle بين المراحل المختلفة). للاطلاع على سجل الأوامر المُغلقة، استخدم /limit-order/history/order/list-by-user?wallet=… (مقسّم بالصفحات عبر nextPageId)؛ وللاطلاع على سجل أحداث أمر بعينه، استخدم /limit-order/history/event/list-by-pda?pda=….
هيكل CPI بلغة Rust
SwapV2:
الأخطاء الشائعة
- تحديد نقاط tick لا تتوافق مع التباعد ←
InvalidTickIndex. احرص دائمًا على المحاذاة عبرTickUtils.getPriceAndTick. - تمرير عدد غير كافٍ من مصفوفات tick في
SwapV2←TickArrayNotFound. استخدمcomputeAmountOutFormatللحصول على القائمة الكاملة. - إنشاء مركز بنطاق كامل دون إضافة امتداد bitmap ← يجب أن يكون PDA الامتداد قابلًا للكتابة؛ يتولى SDK هذا تلقائيًا.
- الخلط بين
sqrt_price_x64والسعر ← هذا الالتباس يُفضي إلى خطأ عامل 2 يصعب اكتشافه. عند الشك، دع SDK يحسب السعر انطلاقًا من قيمة يقرأها الإنسان. - تحصيل المكافآت بشكل متكرر جدًا ← كل تحصيل يكلف معاملة. استخدم
harvestAllRewardsلدمج عدة مراكز في دُفعة واحدة. - حرق NFT ولا يزال الإيجار مستحقًا على الـ mint ← تُغلق
ClosePositionأيضًا mint الـ NFT وحساب ATA الخاص به؛ لا تُغلقهما منفصلَين وإلا سيعود البرنامج بخطأ. - فتح أمر حد عند tick لا يتوافق مع التباعد ←
InvalidTickIndex. احرص دائمًا على التكميم عبرTickUtils.getPriceAndTick. - استدعاء
decreaseLimitOrderعلى أمر اكتمل تنفيذه ←InvalidOrderPhase. استخدمsettleLimitOrderثمcloseLimitOrderعوضًا عن ذلك. - نسيان
dynamicFeeConfigIdمع تمريرenableDynamicFee: true← سيعودCreateCustomizablePoolبخطأInvalidDynamicFeeConfigParams. إما أن تُعطّل الرسوم الديناميكية، أو تختار إعدادًا من/main/clmm-dynamic-config.
الخطوات التالية
sdk-api/typescript-sdk— الواجهة الكاملة لـ SDK.sdk-api/rest-api— نقاط نهاية الأسعار وبيانات pool.user-flows/create-clmm-pool— شرح تفصيلي بدون كود.integration-guides/aggregator— توجيه CLMM ضمن مسار تجميعي.

