الانتقال إلى المحتوى الرئيسي

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
مهمة المجمع هي منح المستخدم أفضل سعر ممكن عبر عدد كبير من المجموعات، وقد يتم تقسيم المدخل الواحد عبر عدة مسارات المجموعات، وتنفيذه بشكل ذري. توثق هذه الصفحة الأجزاء الخاصة بـ Raydium من هذه المهمة: الاكتشاف والعروض وتجميع المعاملات.

الاكتشاف

جرد المجموعات

تحتاج إلى القائمة الكاملة لمجموعات Raydium المباشرة لكل منتج. لديك ثلاث خيارات:
  1. REST API (الأبسط): GET https://api-v3.raydium.io/pools/info/list?poolType=all&pageSize=1000&page=1 يعيد المجموعات على دفعات من 1000. استمر في الترقيم حتى تحصل عليها جميعاً. احفظ الذاكرة المؤقتة لمدة 1–5 دقائق.
  2. الفحص على السلسلة: getProgramAccounts على معرفات برامج CPMM و CLMM و AMM v4، المصفاة حسب محدد حساب الحالة. يعطي ~كل مجموعة مباشرة مع ~10 ثوان من وقت RPC. مفيد عندما تكون API معطلة أو محدودة المعدل.
  3. الهجين: استخدم API كمصدر أساسي؛ قم بإجراء فحص يومي على السلسلة كفحص صحة. يلتزم الفريق بالحفاظ على شمولية API، لكن المجموعات المُنشأة من خلال CPI مباشر (بدون واجهة أمامية) قد تتأخر أحياناً.

بحث الزوج الرمزي

لزوج (mintA, mintB) محدد، استخدم GET /pools/info/mint?mint1=...&mint2=...&poolType=all&sort=liquidity. يعيد كل مجموعة على أي درجة رسوم ونوع منتج. ما يصل إلى ~10 نتائج لكل زوج أمر شائع على الرموز المزدحمة؛ فرز حسب TVL واختر أفضل عدة لتوجيه المسار.

العروض

تختلف رياضيات العروض حسب المنتج. استخدم وظائف الرياضيات البحتة في SDK حتى لا تعيد تطبيقها:
// CPMM
const cpmmQuote = raydium.cpmm.computeAmountOut({
  poolInfo: cpmmPool,
  amountIn,
  mintIn,
  mintOut,
  slippage: 0,        // compute exact expected; layer slippage at route level
});

// CLMM — crosses ticks; deterministic but more expensive.
// `computeAmountOutFormat` is the canonical helper exposed via `PoolUtils` in
// raydium-sdk-v2: the `*Format` suffix signals that it returns the output
// pre-shaped for transaction building (including `remainingAccounts` for tick arrays).
const { output: clmmOut, remainingAccounts } = PoolUtils.computeAmountOutFormat({
  poolInfo:  clmmPool,
  poolState: clmmPoolState,
  tickArrayCache,
  amountIn,
  tokenIn:   mintIn,
  slippage:  0,
});

// AMM v4
const ammV4Quote = raydium.liquidity.computeAmountOut({
  poolInfo: ammV4Pool,
  amountIn,
  mintIn: mintIn,
  mintOut: mintOut,
  slippage: 0,
});
النتائج للجميع الثلاثة: { amountOut, fee, priceImpact, minAmountOut }. لمقارنة المجمع، استخدم amountOut (قبل الانزلاق).

حداثة الذاكرة المؤقتة

حالة المجموعة تصبح قديمة بسرعة. أهداف الحداثة الموصى بها:
نوع المجموعةتكرار إعادة الجلبالسبب
CPMM مع <$100k TVL<10sالاحتياطيات تتحرك في كل صفقة.
CPMM مع >$10M TVL30–60sالاحتياطيات الرئيسية؛ الصفقات الصغيرة هي ضوضاء.
CLMM<30sحدود التجزئة؛ صفقة واحدة كبيرة يمكن أن تعيد تكوين السيولة.
AMM v4<30sحركات جانب OpenBook غير ملتقطة في الخزائن.
لمجمع يأخذ عروضاً بزمن انتقالي تفاعلي، اشترك في تحديثات حساب WebSocket (accountSubscribe) على كل حالة مجموعة ذات صلة. هذا يقلب النموذج من الاستقصاء إلى الدفع.

تعديلات Token-2022

إذا كان أي رمز في المسار يحتوي على رسم نقل Token-2022، يجب أن تعدل رياضيات العرض المدخلات والمخرجات لكل algorithms/token-2022-transfer-fees. يتعامل SDK مع هذا إذا تم ملء poolInfo.mintA.extensions.transferFeeConfig. أكّد بالنظر إلى حقل .extensions قبل الوثوق بالعرض.

التوجيه

مسارات المجموعة الواحدة

معظم المسارات عبارة عن مجموعة واحدة. اختر المجموعة التي amountOut بها أعلى. إذا كانت عدة قريبة، فاكسر العلاقة حسب درجة الرسوم (الأقل أفضل)، ثم حسب TVL (الأكثر أكثر أماناً).

توجيه مقسم

بالنسبة للصفقات الكبيرة حيث تحتوي مجموعة واحدة على >5% تأثير السعر، قسّم عبر المجموعات. خوارزمية جشعة بسيطة:
remaining = amountIn
routes    = []
while remaining > 0:
    best_pool, best_size = argmax over pools of:
        marginal_out_per_in(pool, current_size_toward_pool + epsilon)
    size = min(remaining, best_pool.max_size_at_target_impact)
    routes.append((best_pool, size))
    remaining -= size
هذا ينتج متجه توجيه [(pool_A, 0.6), (pool_B, 0.3), (pool_C, 0.1)] يقلل التأثير الكلي. الحل التحسيني المحدب المناسب (على سبيل المثال، معادلة الأسعار الهامشية عبر المجموعات) يقع ضمن ~1% من النتيجة الجشعة في الممارسة.

مسارات متعددة القفزات

USDC → RAY → SOL عبر مجموعتين منفصلتين أمر شائع عندما لا تعطي مجموعة USDC-SOL مباشرة عرضاً جيداً (نادر جداً). طبّق حدود الانزلاق لكل قفزة؛ تفرض كل قفزة minAmountOut الخاص بها. انظر algorithms/slippage-and-price-impact. القفزات المتعددة عبر نفس المجموعة (على سبيل المثال، قفزتان CLMM على SOL-USDC) أقل كفاءة دائماً من قفزة واحدة — لا تولّد مثل هذه المسارات.

تجميع المعاملات

قفزة واحدة، مجموعة واحدة

استخدم raydium.trade.swap الخاص بـ SDK مباشرة:
const { execute } = await raydium.trade.swap({
  poolKeys:        poolInfo,
  amountIn,
  amountOut:       quote.minAmountOut,
  fixedSide:       "in",
  inputMint:       mintIn,
  txVersion:       TxVersion.V0,
  computeBudgetConfig: {
    units:         250_000,
    microLamports: priorityFee,
  },
});

انقسام وقفزات متعددة

ركّب ATAs والتعليمات يدويًا. النمط:
[1] ComputeBudget set_compute_unit_limit
[2] ComputeBudget set_compute_unit_price
[3] createATA (if needed, once per mint the user doesn't hold)
[4..N] SwapInstruction for each (pool, size) in routes
[N+1] CloseAccount (if you wrap/unwrap SOL)
الكل داخل معاملة واحدة للذرية. بالنسبة لانقسام من 3 مجموعات على V0 مع جداول بحث العناوين، هذا عادة ما يناسب ~1100 بايت. بالنسبة لـ 4+ مجموعات، حد حجم المعاملة يفرض إما معاملات متعددة أو تجميع في رمز مركزي.

الذرية

يجب أن تضمن المجمعات الذرية: إما أن ينزل المسار الكامل أو لا ينزل أي منه. تعليمات Raydium swap تعود إلى ExceededSlippage، لذلك مسار متعدد المجموعات حيث تفشل قفزة واحدة يسبب المعاملة بأكملها للعودة. مجاني. الاستثناء الوحيد: إذا ذهب المسار الخاص بك عبر Raydium + DEX تابع لجهة خارجية، تأكد من أن DEX أيضاً لديه نموذج الانعكاس على الانزلاق. بعض البرامج تتجاهل حدود الانزلاق (نادرة جداً).

الثغرات

1. عروض قديمة

بين رؤية المستخدم “ستتلقى 125.43 RAY” وهبوط المعاملة، يمكن أن تتغير الاحتياطيات. أعد جلب حالة المجموعة على الفور قبل الإرسال؛ أعد العرض؛ إذا كان العرض الجديد أسوأ >1%، توقف وأعد التأكيد مع المستخدم.

2. قوائم سوداء المجموعات

بعض مجموعات Raydium هي رموز احتيالية برسوم نقل مضبوطة على 99% أو بامتدادات غير قابلة للنقل. تصنف API REST هذه (انظر حقل tags)؛ تخطّ أي مجموعة موسومة scam أو honeypot. تشغيل الفحوصات الأمنية الخاصة بك فوق علامات Raydium أمر حكيم.

3. مطلب حالة الملاحظة على CLMM

CLMM SwapV2 يأخذ حساب observation_state. يملأه SDK لك؛ التعليمات المبنية يدويًا غالباً ما تنسى، مما يسبب البرنامج للعودة بـ AccountNotFound. تضمن دائماً تضمينه.

4. جداول بحث العناوين

تحافظ Raydium على جداول بحث عامة لأكثر حساباتها استخداماً (الرموز الرئيسية، معرفات البرنامج، AmmConfigs). يجب على المجمعات استهلاك هذه — فهي توفر ~100 بايت لكل معاملة وتمكّن المسارات الأكبر من أن تناسب V0. سحب عناوين LUT:
const raydiumLUTs = await raydium.getRaydiumLutAddresses();

5. التعامل مع الازدحام

خلال نوافذ الحجم المرتفع، يمكن للمعاملات أن تجلس في mempool لعدة كتل. إعادة محاولة عدوانية عند انتهاء صلاحية TX (وليس عند الارتجاع — الارتجاع حتمي) موصى به. خيار SDK sendAndConfirm يفعل محاولات أساسية؛ المجمعات الإنتاجية تقيّد منطقها الخاص (حزم Jito، بث RPC متعدد) في الأعلى.

قائمة التحقق

قبل الانطلاق، تحقق من:
  • اكتشاف المجموعة يغطي CPMM + CLMM + AMM v4 بشكل شامل.
  • العروض تطابق عرض واجهة Raydium الخاصة ضمن 1 نقطة أساس في حفنة من الصفقات الاختبارية.
  • توجيه الانقسام يبدأ للصفقات >5% تأثير على أي مجموعة واحدة.
  • رسوم الأولوية مختارة ضد رسوم برنامج المجموعة الحديثة (انظر integration-guides/priority-fee-tuning).
  • رسوم نقل Token-2022 محسوبة وموضحة للمستخدم.
  • المعاملات تعود بشكل نظيف عندما يتم تجاوز الانزلاق.
  • منطق الإعادة يميز انتهاء صلاحية tx (إعادة محاولة) من الارتجاع (لا تعيد محاولة).

المؤشرات

المصادر: