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

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 إلى الإجابة على أربعة أسئلة لكل مستخدم: في أي تجمعات لديه المستخدم حصص سيولة؟ ما المراكز (NFTs الخاصة بـ CLMM) التي يملكها؟ في أي مزارع يرهن؟ كم تبلغ قيمة كل هذا؟ توثق هذه الصفحة كل واحد منها.

كشف مراكز Raydium

رموز LP الكلاسيكية (CPMM و AMM v4)

تبدو مثل أي رمز SPL آخر: حساب ATA الخاص بالمستخدم يحتوي على رصيد. تعرض المحفظة هذا كمجرد رمز آخر افتراضيًا. لكشفه كمركز Raydium LP:
  1. عدّد حسابات الرموز الخاصة بالمستخدم: connection.getParsedTokenAccountsByOwner(user, { programId: TOKEN_PROGRAM_ID }).
  2. لكل صك، تحقق من قائمة Raydium: GET https://api-v3.raydium.io/pools/info/lps?lps=<LP_MINT>,... (قم بتجميع ما يصل إلى حوالي 50 صك LP لكل استدعاء).
  3. بالنسبة للصكوك التي تطابق، تعيد API مرجع التجمع. استخدمه لحساب قيمة المركز بالرموز:
token_a_owned = user_lp_balance * poolReserves.A / lpMint.supply
token_b_owned = user_lp_balance * poolReserves.B / lpMint.supply
usd_value     = token_a_owned * priceA_usd + token_b_owned * priceB_usd
عرض كل من رصيد LP والمبالغ المفكوكة — يفكر المستخدمون من حيث الرموز الأساسية وليس وحدات LP.

NFTs مركز CLMM

مراكز CLMM هي NFTs. يتم اشتقاق PersonalPositionState PDA الخاص بكل مركز من صك NFT. للكشف:
  1. عدّد NFTs الخاصة بالمستخدم. بالنسبة لـ NFTs الخاصة بـ Metaplex القديمة: فلتر حسابات الرموز تلك التي لها عرض 1 وعدد عشري 0.
  2. لكل صك NFT، حاول اشتقاق PDA الخاص بـ PersonalPositionState:
import { CLMM_PROGRAM_ID } from "@raydium-io/raydium-sdk-v2";

const [positionPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("position"), nftMint.toBuffer()],
  CLMM_PROGRAM_ID,
);

const accountInfo = await connection.getAccountInfo(positionPda);
if (!accountInfo || !accountInfo.owner.equals(CLMM_PROGRAM_ID)) return null;
// إنه مركز Raydium CLMM — قم بفك التشفير.
  1. قم بفك التشفير عبر raydium.clmm.getPositionInfo({ positionPda }) للحصول على:
    • poolId → جلب التجمع لحل الصكوك
    • tickLower، tickUpper → نطاق العرض
    • liquidity، tokensOwedA/B → حساب قيمة المركز + الرسوم المعلقة
    • rewardInfos → المكافآت المعلقة لكل تيار
  2. بالنسبة للمراكز-NFTs الصادرة بموجب Token-2022 (OpenPositionWithToken22Nft)، يكون برنامج صك NFT هو Token-2022 بدلاً من SPL Token. عدّد كليهما عند المسح.

رهانات المزرعة

لكل نسخة من Farm v3 و v5 و v6 لديها PDA دفتر للمستخدم. الاشتقاقات:
// جرّب جميع إصدارات المزرعة الثلاثة لكل من تفاعلات المزرعة المحتملة للمستخدم.
// الطريقة الأرخص: اسأل API أولاً، التي فهرست جميع مواقع المستخدم.

const r = await fetch(
  `https://api-v3.raydium.io/positions/staking?wallet=${user.toBase58()}`
).then(r => r.json());

for (const s of r.data.stakings) {
  // s.farmId, s.stakedAmount, s.pendingRewards[], s.poolApr, ...
}
بالنسبة للمحافظ التي تفضل الكشف الكامل على السلسلة: كرّر PDAs الممكنة UserLedger بواسطة دمج المستخدم مع قائمة منتقاة من معرّفات المزرعة “المحتملة”. لا يمكن عمليًا تعداد جميع معرّفات المزرعة بشكل شامل (توجد آلاف)؛ استخدم API.

حساب قيمة المركز

CPMM / AMM v4 LP

const poolInfo = await raydium.<type>.getPoolInfoFromRpc({ poolId });
const myShare  = userLpBalance / poolInfo.lpMint.supply;
const tokensA  = BigInt(poolInfo.mintAmountA) * BigInt(userLpBalance)
                / BigInt(poolInfo.lpMint.supply);
const tokensB  = BigInt(poolInfo.mintAmountB) * BigInt(userLpBalance)
                / BigInt(poolInfo.lpMint.supply);
ثم اضرب كل واحد بسعر الصك بالدولار (من raydium.token أو برنامج معالجة الأسعار).

مركز CLMM

const position = await raydium.clmm.getPositionInfo({ positionPda });
const pool     = await raydium.clmm.getPoolInfoFromRpc({ poolId: position.poolId });

const { amountA, amountB } = PoolUtils.getAmountsFromLiquidity({
  sqrtPriceX64:  pool.sqrtPriceX64,
  tickLower:     position.tickLower,
  tickUpper:     position.tickUpper,
  liquidity:     position.liquidity,
  slippage:      0,  // for display, no slippage
});

// الرسوم المعلقة — عرض منفصل باعتباره "غير مجموع"
const fees = {
  A: position.tokenFeesOwedA,
  B: position.tokenFeesOwedB,
};

// المكافآت المعلقة — تجمع CLMM به 0–3 تيارات مكافآت.
const rewards = position.rewardInfos.map(r => ({
  mint:          r.rewardMint,
  rewardAmount:  r.rewardAmountOwed,
}));
اعرض كـ:
  • قيمة السيولة (السعر الحالي)
  • الرسوم غير المجموعة
  • المكافآت المعلقة لكل تيار
  • النطاق: [tickLower_price, tickUpper_price] مع شريط بصري يوضح ما إذا كان السعر الحالي ضمن النطاق

رهان المزرعة

// رد API يتضمن بالفعل المكافآت المعلقة؛ استخدمها مباشرة.
const apr       = stakingFarm.apr;               // %, annualized
const staked    = stakingFarm.stakedAmount;      // smallest units of staking mint
const rewards   = stakingFarm.pendingRewards;    // array of { mint, amount }
للحسابات على السلسلة، عكس محاسبة المزرعة:
pending_reward_i = user.deposited
                 * farm.reward_per_share_x64[i] / 2^64
                 - user.reward_debts[i]
تأكد من تحديث reward_per_share_x64 بصيغة التحديث البطيء قبل الحساب (الوقت المنقضي × معدل الإصدار ÷ إجمالي المرهون).

محاكاة المعاملة للمعاينة

قبل أن يوقّع المستخدم، عادة ما تعاين المحافظ تغييرات الرصيد. استخدم simulateTransaction:
const sim = await connection.simulateTransaction(tx, {
  sigVerify: false,
  commitment: "confirmed",
  accounts: {
    encoding: "base64",
    addresses: [userTokenAtaA, userTokenAtaB, userLpAta].map(a => a.toBase58()),
  },
});

// فك تشفير رصيد كل حساب مُعاد والفرق مقابل أرصدة ما قبل tx.
for (const [i, acctData] of sim.value.accounts!.entries()) {
  const newBalance = decodeTokenAccount(acctData!.data[0]).amount;
  // compare to pre-tx balance, show Δ
}
تطلب معاملة accounts من المدقق إرجاع حالة الحساب بعد المحاكاة للعناوين المدرجة. أكثر دقة بكثير من محاولة التنبؤ بتغيير الرصيد من شكل التعليمات وحده.

مخاطر المحاكاة

  • تبديلات CLMM تحتاج إلى صفائف علامات صالحة. إذا كان حجم إدخال المستخدم سيعبر إلى صفيفة علامات غير مهيأة، تنعكس المحاكاة (مثل التنفيذ). اسطح هذا بوضوح في الواجهة.
  • رسم الأولوية. تعمل المحاكاة بدون تطبيق تعليمات ميزانية الحساب. بالنسبة لمعاملة كبيرة تتجاوز الـ 200k CU الافتراضي، تفشل المحاكاة لكن التنفيذ الفعلي مع حد CU صريح ينجح. اضبط دائمًا حد CU على tx المحاكاة أيضًا.
  • blockhash طازج. تستخدم المحاكاة blockhash الحالي؛ إذا استغرقت التوقيع أكثر من 60 ثانية، تصبح tx غير صالحة. أعد المحاكاة إذا تردد المستخدم.

عرض Token-2022

يجب وضع علامات على الرموز الموجودة في برنامج Token-2022 كما هي في قائمة الرموز الخاصة بالمحفظة، لأن لها سطحًا مختلفًا للمخاطر:
  • صكوك رسم التحويل: عرض transferFeeBasisPoints الحالي باسم “Transfer fee: X%” بجانب الرصيد. أنذر عند الاستقبال — قد لا يدرك المستخدمون أنهم سيتلقون أقل مما أرسله المرسل.
  • صكوك hook التحويل: اسطح معرّف برنامج hook. يمكن لـ hook ضار حجب التحويلات الصادرة؛ يجب على المستخدمين التحقق من أن hook هو الذي يتوقعونه.
  • صكوك غير قابلة للتحويل: عرض “Non-transferable” وتعطيل swap/send. عادة ما تكون هذه رموز soulbound أو بيانات اعتماد.
  • صكوك تحمل الفائدة: الرصيد في الواجهة المشتقة من TokenAccount.amount لا يعكس الفائدة المتراكمة. استخدم amountToUiAmount من @solana/spl-token (الذي يطبق عامل التحجيم) للقيمة المعروضة.

عرض APR للمزرعة

يجب أن يجمع APR المعروض للمستخدمين جميع تيارات المكافآت المباشرة، المحولة إلى دولار وسنويًا:
let apr = 0;
for (const r of farm.rewardInfos) {
  if (r.rewardState !== 1) continue;   // skip not-running
  const annualRewardTokens = Number(r.emissionPerSecond) * 86400 * 365 / 1e<decimals>;
  const annualRewardValue  = annualRewardTokens * priceUsd(r.rewardMint);
  const tvlValue           = Number(farm.totalStaked) * priceUsd(farm.stakingMint) / 1e<decimals>;
  apr += annualRewardValue / tvlValue;
}
اعرض كـ APR: X.Y%. إذا كان صك الرهان رمز LP، احسب أيضًا APR رسم المزرعة الأساسي الأساسي وضع علامة على المجموع باسم “Total APR” أو “APR + fees”.

مؤشرات

المصادر:
  • Raydium SDK v2 — مساعدات المركز/المزرعة.
  • نقاط نهاية موقع المستخدم على api-v3.raydium.io.