Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
لافتة الإصدار. جميع الأمثلة تستهدف @raydium-io/raydium-sdk-v2@0.2.42-alpha على شبكة Solana mainnet-beta، تم التحقق منها في 2026-04. معرفات البرامج تأتي من reference/program-addresses عبر SDK.

الإعداد

كل مثال على هذه الصفحة يعكس ملفًا في raydium-sdk-V2-demo/src/clmm؛ رابط GitHub يظهر بجانب كل قسم. يتبع التمهيد ملف config.ts.template من مستودع العرض التوضيحي (المصدر) — disableFeatureCheck: true هو الإعداد الموصى به لأي تكامل غير تافه:

إنشاء مجمع CLMM

المصدر: src/clmm/createPool.ts
يقوم SDK بـ:
  • ترتيب mint1/mint2 حسب ترتيب البايت قبل الاشتقاق.
  • حساب sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64).
  • إنشاء حسابات observation و tick_array_bitmap_extension.
  • دفع رسوم إنشاء المجمع المحددة بواسطة ammConfig.

فتح مركز في نطاق محدد

المصدر: src/clmm/createPosition.ts
يقوم SDK تلقائيًا بحساب مصفوفات التكات التي يلمسها النطاق وتجميع تعليمات 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.
المراكز ذات المُصدِر المقيد تتطلب منشئ إغلاق متوافق. هذه المراكز لها حساب رمز NFT مجمد. يجب أن يضيف ClosePosition معرف المجمع للمركز كأول حساب متبقي حتى يتمكن CLMM من إذابة الحساب قبل حرق الرمز. فرع مصدر البرنامج لا يتضمن تغيير SDK. تأكد من أن إصدار SDK الخاص بك يدعم بشكل صريح مسار الإغلاق المجمد قبل تفعيل إنشاء مركز المُصدِر المقيد.
لعميل Anchor مباشر، احتفظ بالحسابات المعلنة دون تغيير وأضف المجمع:
يمكنك تمرير poolId في كل إغلاق. يقرأه CLMM فقط عندما يكون positionNftAccount مجمدًا، مما يحافظ على توافق مسار عميل واحد مع المراكز القديمة والجديدة.

جمع المكافآت

المصدر: src/clmm/harvestAllRewards.ts
يمشي harvestAllRewards عبر كل مركز على كل مجمع تم تمريره، ويجمع تعليمات CollectReward (وأي UpdateRewardInfos)، ويقسمها عبر المعاملات إذا لزم الأمر.

المبادلة

المصدر: src/clmm/swap.ts
يمشي computeAmountOutFormat عبر خريطة التكات خارج السلسلة باستخدام نفس منطق البرنامج على السلسلة ويعيد:
  • المبلغ المتوقع للخروج،
  • الحد الأدنى للمبلغ بعد الانزلاق،
  • قائمة حسابات مصفوفة التكات التي ستلمسها المبادلة الفعلية (remainingAccounts).
مرّر دائمًا remainingAccounts المُرجعة من المحاكاة: إذا مررت عددًا قليلاً جدًا، ستعود المبادلة في منتصف المسير مع TickArrayNotFound؛ إذا مررت واحدة قديمة، ستهدر الحساب.

إنشاء مجمع CLMM قابل للتخصيص

createCustomizablePool هي نقطة الدخول الجديدة التي تكشف عن تبديلات الرسوم الديناميكية والرسوم أحادية الجانب في وقت إنشاء المجمع. تأخذ نفس الشكل مثل createPool بالإضافة إلى ثلاث إضافات:
يستمر createPool في العمل لمسار الرسوم الافتراضية وبدون أوامر الحد والرسوم الديناميكية. استخدم createCustomizablePool كلما احتجت إلى أي من الأزرار الثلاثة الجديدة. انظر products/clmm/instructions للحصول على قائمة الحسابات على السلسلة.

أوامر الحد

يوقف أمر الحد إدخال المستخدم عند تكة واحدة ويتم ملؤه FIFO عندما تعبر مبادلة تلك التكة. يتم دفع المخرجات إلى ATA المالك في وقت التسوية؛ لا يحتاج المالك إلى أن يكون متصلاً بالإنترنت ليتم ملؤه.

فتح أمر حد

يشتق SDK LimitOrderState PDA من (pool, owner, tick, nonce)، ويزيد LimitOrderNonce لكل (pool, owner)، ويدرج الأمر في مجموعة FIFO في تلك التكة.

زيادة / تقليل أمر مفتوح

يمكن لـ 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:
إذا لم تحتج المبادلة أبدًا إلى الامتداد، فاحذفها؛ وإلا فهي أول حساب متبقي.

الأخطاء الشائعة

  • نقاط نهاية التكة خارج المسافةInvalidTickIndex. قم دائمًا بالمحاذاة عبر TickUtils.getPriceAndTick.
  • عدم توفير مصفوفات تكات كافية في SwapV2TickArrayNotFound. استخدم computeAmountOutFormat للحصول على القائمة الكاملة.
  • مركز النطاق الكامل بدون امتداد الخريطة النقطية → يجب أن يكون PDA الامتداد قابلاً للكتابة؛ يتعامل SDK مع هذا تلقائيًا.
  • الخلط بين sqrt_price_x64 و price → الالتباس بمعامل 2 هنا مؤلم بشكل خاص. عند الشك، دع SDK يحسبها من سعر يمكن قراءته بواسطة الإنسان.
  • جمع المكافآت بحماس شديد → كل جمع يكلف معاملة واحدة. قم بالتجميع عبر harvestAllRewards عبر العديد من المراكز.
  • إغلاق حسابات NFT بنفسكClosePosition يحرق NFT ويغلق ATA الخاص به. كما يغلق رمز NFT من Token-2022؛ يبقى رمز SPL Token الكلاسيكي عند إمداد صفر لأن هذا البرنامج لا يمكنه إغلاق الرموز. لا تغلق الحسابات المدعومة بشكل منفصل أو ستعود التعليمة.
  • فتح أمر حد عند تكة غير متباعدةInvalidTickIndex. قم دائمًا بتحديد الكمية عبر TickUtils.getPriceAndTick.
  • استدعاء decreaseLimitOrder على أمر مملوء بالكاملInvalidOrderPhase. استخدم settleLimitOrder ثم closeLimitOrder بدلاً من ذلك.
  • نسيان dynamicFeeConfigId أثناء تمرير enableDynamicFee: true → عودة CreateCustomizablePool هي InvalidDynamicFeeConfigParams. إما أطفئ الرسوم الديناميكية، أو اختر تكوينًا من /main/clmm-dynamic-config.

الخطوات التالية

المصادر: