هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
بيان الإصدار. جميع أمثلة TypeScript تستهدف
@raydium-io/raydium-sdk-v2@0.2.64-alpha؛ تم تنفيذها آخر مرة مقابل 0.2.42-alpha (2026-04) وتم إعادة فحص توقيعات الاستدعاء الخاصة بها مقابل مصدر 0.2.64-alpha في 2026-09-09، مقابل Solana mainnet-beta. هيكل Rust CPI في النهاية يستهدف raydium-clmm على فرع chore/upgrade-anchor، Anchor 1.0.2، نفس الإصدار المثبت كما في صفحة CPMM، بحيث يمكن للاثنين أن يعيشا في صندوق واحد. master لا يزال يثبت 0.32.1. معرفات البرامج تأتي من reference/program-addresses عبر SDK.الإعداد
raydium-sdk-V2-demo/src/clmm؛ رابط GitHub يجلس بجانب كل قسم. يتبع التمهيد ملف config.ts.template من مستودع العرض التوضيحي (المصدر) — disableFeatureCheck: true هو الإعداد الموصى به لأي تكامل غير تافه:
إنشاء مجمع CLMM
المصدر:src/clmm/createPool.ts
- ترتيب
mint1/mint2حسب ترتيب البايت قبل الاشتقاق. - حساب
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - إنشاء حسابات
observationوtick_array_bitmap_extension. - دفع رسوم إنشاء المجمع المحددة بواسطة
ammConfig.
فتح مركز في نطاق محدد
المصدر:src/clmm/createPosition.ts
OpenPosition* تخصص مصفوفة tick مفقودة بنفسها، على حساب الدافع.
زيادة السيولة على مركز موجود
المصدر:src/clmm/increaseLiquidity.ts
تقليل السيولة (وجمع الرسوم في نفس الوقت)
المصدر:src/clmm/decreaseLiquidity.ts و src/clmm/closePosition.ts
decreaseLiquidity مع liquidity = new BN(0). التأثير الجانبي للتعليمة هو تسوية token_fees_owed_{0,1} و reward_amount_owed ونقلها — هذه هي الطريقة الوحيدة لجمع أي منهما.
لإغلاق المركز بالكامل بعد تصفير السيولة والرسوم، مرّر ownerInfo: { closePosition: true } على استدعاء decreaseLiquidity النهائي. يضيف SDK ClosePosition ويحرق NFT.
لعميل Anchor مباشر، احتفظ بالحسابات المعلنة دون تغيير وأضف المجمع:
poolId في كل إغلاق. يقرأه CLMM فقط عندما يكون positionNftAccount مجمدًا، مما يحافظ على مسار عميل واحد متوافق مع المراكز القديمة والجديدة.
جمع المكافآت
المصدر:src/clmm/harvestAllRewards.ts
harvestAllRewards عبر كل مركز على كل مجمع تم تمريره، ويجمع استدعاءات DecreaseLiquidity بدون سيولة التي تسوي الرسوم والمكافآت (بالإضافة إلى أي UpdateRewardInfos)، ويقسمها عبر المعاملات إذا لزم الأمر.
المبادلة
المصدر:src/clmm/swap.ts
amountCalculated) بالإضافة إلى قائمة الحساب الدقيقة التي ستلمسها المبادلة (accounts).
مرّر دائمًا remainingAccounts التي تعيدها المحاكاة: إذا كانت قليلة جدًا، ستعود المبادلة في منتصف المسير مع NotEnoughTickArrayAccount؛ الحسابات القديمة تهدر فقط الحساب.
PoolUtils.computeAmountOutFormat لا يزال موجودًا، لكنه يحتاج إلى ComputeClmmPoolInfo (الـ computePoolInfo من getPoolInfoFromRpc، وليس كائن مجمع API) بالإضافة إلى وسيطتين مطلوبتين أخريين — tickarrayBitmapExtension و blockTimestamp — ولا توجد طريقة raydium.clmm.fetchTickArrays (fetchTickArrays هي دالة حرة؛ المساعدات على مستوى الوحدة هي PoolUtils.fetchMultiplePoolTickArrays و tickData / tickArrays المعادة بواسطة getPoolInfoFromRpc).إنشاء مجمع CLMM قابل للتخصيص
createCustomizablePool هي نقطة الدخول التي تعرض مفاتيح الرسوم الديناميكية والرسوم أحادية الجانب في وقت إنشاء المجمع. تأخذ شكل createPool بالإضافة إلى إضافتين:
createPool في العمل لمسار الرسوم الافتراضية بدون رسوم ديناميكية. استخدم createCustomizablePool كلما احتجت إلى أي مفتاح. انظر products/clmm/instructions لقائمة الحساب على السلسلة.
أوامر الحد
يوقف أمر الحد إدخال المستخدم عند tick واحد ويتم ملؤه FIFO عندما تعبر مبادلة هذا الـ tick. يتم دفع المخرجات إلى ATA المالك في وقت التسوية؛ لا يحتاج المالك إلى أن يكون متصلاً ليتم ملؤه.فتح أمر حد
LimitOrderState PDA من (owner, nonce PDA, order nonce)، ويرفع LimitOrderNonce لكل محفظة، ويدرج الأمر في مجموعة 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=….
هيكل Rust CPI
SwapV2:
الأخطاء الشائعة
- نقاط نهاية tick خارج المسافة →
TickAndSpacingNotMatch. قم دائمًا بالمحاذاة عبرTickUtil.getPriceAndTick(singularTickUtil). - عدم توفير مصفوفات tick كافية في
SwapV2→NotEnoughTickArrayAccount. خذ القائمة منswapInternal(...).accounts. - مركز النطاق الكامل بدون امتداد bitmap → يجب أن يكون PDA الامتداد قابلاً للكتابة؛ يتعامل SDK مع هذا تلقائيًا.
- الخلط بين
sqrt_price_x64وprice→ الالتباس بمعامل 2 هنا مؤلم بشكل خاص. عند الشك، دع SDK يحسبه من سعر يمكن قراءته بواسطة الإنسان. - جمع المكافآت بحماس شديد → كل جمع هو
DecreaseLiquidityبدون سيولة ويكلف معاملة واحدة. جمّع عبرharvestAllRewardsعبر العديد من المراكز، وتذكر أنexecuteالخاص به يحتاج إلى{ sequentially: true }. - إغلاق حسابات NFT بنفسك →
ClosePositionيحرق NFT ويغلق ATA الخاص به. كما يغلق mint NFT Token-2022؛ يبقى mint SPL Token الكلاسيكي عند صفر الإمداد لأن هذا البرنامج لا يمكنه إغلاق mints. لا تغلق الحسابات المدعومة بشكل منفصل أو ستعود التعليمة. - فتح أمر حد عند tick غير متباعد →
TickAndSpacingNotMatch. قم دائمًا بتحديد الكمية عبر مساعدgetOrderTickالمُصدَّر. - استدعاء
decreaseLimitOrderعلى أمر مملوء بالكامل →InvalidOrderPhase. استخدمsettleLimitOrderثمcloseLimitOrderبدلاً من ذلك. - توقع علامة
enableDynamicFee→ لا توجد. حذفdynamicFeeConfigببساطة ينشئ مجمع برسوم ثابتة، بصمت وبدون خطأ. إذا كنت تريد رسوم ديناميكية، مرّرPublicKeyحساب الإعدادات، المختار من/main/clmm-dynamic-config.
الخطوات التالية
sdk-api/typescript-sdk— سطح SDK الكامل.sdk-api/rest-api— نقاط نهاية الاقتباس وبيانات تعريف المجمع.user-flows/create-clmm-pool— شرح بدون كود.integration-guides/aggregator— توجيه CLMM كجزء من مسار.

