Ana içeriğe atla

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.

Bu sayfa yapay zekâ tarafından otomatik olarak çevrilmiştir. İngilizce sürüm esas alınır.İngilizce sürümü görüntüle →
Raydium’u entegre eden cüzdanlar, genellikle her kullanıcı için dört soruyu yanıtlamak zorundadır: bu kullanıcı hangi havuzlarda LP’ye sahiptir? hangi pozisyonları (CLMM NFT’leri) tutarlar? hangi çiftçiliklere hisse tutarlar? hepsinin değeri ne kadardır? Bu sayfa bunların her birini belgelemektedir.

Raydium pozisyonlarını algılama

Klasik LP tokenleri (CPMM, AMM v4)

Bunlar diğer SPL Token’ler gibi görünür: kullanıcının ATA’sı bir bakiye tutar. Bir cüzdan bunu varsayılan olarak sadece başka bir token olarak gösterir. Bunu bir Raydium LP pozisyonu olarak ortaya koymak için:
  1. Kullanıcının token hesaplarını numaralandırın: connection.getParsedTokenAccountsByOwner(user, { programId: TOKEN_PROGRAM_ID }).
  2. Her mint için Raydium’un mint listesini kontrol edin: GET https://api-v3.raydium.io/pools/info/lps?lps=<LP_MINT>,... (çağrı başına ~50 LP mint’e kadar toplu işleyin).
  3. Eşleşen mintler için, API havuz referansını döndürür. Pozisyonun token ile gösterilen değerini hesaplamak için kullanın:
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
Hem LP bakiyesini hem de sarılmamış tutarları gösterin — kullanıcılar LP birimleri değil, temel tokenleri düşünürler.

CLMM pozisyon NFT’leri

CLMM pozisyonları NFT’lerdir. Her pozisyonun PersonalPositionState PDA’sı NFT mint’inden türetilir. Algılamak için:
  1. Kullanıcının NFT’lerini numaralandırın. Eski Metaplex NFT’leri için: token hesaplarını, arzı 1 ve ondalık basamağı 0 olan olanlarla filtreyin.
  2. Her NFT mint’i için PersonalPositionState PDA’sını türetmeyi deneyin:
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;
// Bu bir Raydium CLMM pozisyonu — kodunu çöz.
  1. raydium.clmm.getPositionInfo({ positionPda }) aracılığıyla kodunu çözerek şunları alın:
    • poolId → mint’leri çözmek için havuzu getir
    • tickLower, tickUpper → aralığını göster
    • liquidity, tokensOwedA/B → pozisyon değeri + bekleyen ücretleri hesapla
    • rewardInfos → akış başına bekleyen ödüller
  2. Token-2022 altında verilen pozisyon-NFT’leri için (OpenPositionWithToken22Nft), NFT mint’inin programı SPL Token yerine Token-2022’dir. Tarama yaparken her ikisini de numaralandırın.

Çiftçilik hisseleri

Farm v3 / v5 / v6’nın her biri kullanıcı başına bir defter PDA’sına sahiptir. Türetmeler:
// Kullanıcının olası çiftçilik etkileşimlerinin her biri için üç çiftçilik sürümünü deneyin.
// En ucuz yaklaşım: önce API'ye sorun; tüm kullanıcı pozisyonlarını indekslemişdir.

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, ...
}
Tamamen zincir üstü algılama tercih eden cüzdanlar için: UserLedger PDA’larını, kullanıcıyı “olası” çiftçilik kimliği listesine göre karma yaparak yinelenebilir. Tüm çiftçilik kimliklerini kapsamlı olarak numaralandırmak pratik değildir (binlerce vardır); API’yi kullanın.

Pozisyon değerini hesaplama

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);
Daha sonra her birini mint’in USD fiyatıyla çarpın (raydium.token veya fiyat oracle’ından).

CLMM pozisyonu

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,  // ekran gösterimi için, kaymama
});

// Bekleyen ücretler — "toplanmayan" olarak ayrı olarak gösterin
const fees = {
  A: position.tokenFeesOwedA,
  B: position.tokenFeesOwedB,
};

// Bekleyen ödüller — bir CLMM havuzu 0–3 ödül akışına sahiptir.
const rewards = position.rewardInfos.map(r => ({
  mint:          r.rewardMint,
  rewardAmount:  r.rewardAmountOwed,
}));
Şu şekilde gösterin:
  • Likidite değeri (cari fiyat)
  • Toplanmayan ücretler
  • Akış başına bekleyen ödüller
  • Aralık: [tickLower_price, tickUpper_price] cari fiyatın aralık içinde olup olmadığını gösteren görsel bir çubukla

Çiftçilik hissesi

// API yanıtı zaten bekleyen ödülleri içerir; doğrudan kullanın.
const apr       = stakingFarm.apr;               // %, annualized
const staked    = stakingFarm.stakedAmount;      // smallest units of staking mint
const rewards   = stakingFarm.pendingRewards;    // array of { mint, amount }
Zincir üstü hesaplama için, çiftçiliğin muhasebesiyle eşleştirin:
pending_reward_i = user.deposited
                 * farm.reward_per_share_x64[i] / 2^64
                 - user.reward_debts[i]
Hesaplamadan önce reward_per_share_x64’ü tembel güncelleme formülüyle yenileyin (geçen süre × emisyon hızı ÷ toplam_hisse).

İşlem simülasyonu ön izlemesi için

Kullanıcı imzalamadan önce, cüzdanlar genellikle bakiye değişikliklerini ön izlerler. simulateTransaction kullanın:
const sim = await connection.simulateTransaction(tx, {
  sigVerify: false,
  commitment: "confirmed",
  accounts: {
    encoding: "base64",
    addresses: [userTokenAtaA, userTokenAtaB, userLpAta].map(a => a.toBase58()),
  },
});

// Her döndürülen hesabın bakiyesini kodunu çözerek ve işlem öncesi bakiyelerine karşı kıyasla.
for (const [i, acctData] of sim.value.accounts!.entries()) {
  const newBalance = decodeTokenAccount(acctData!.data[0]).amount;
  // işlem öncesi bakiye ile karşılaştırın, Δ'ı gösterin
}
accounts parametresi, doğrulayıcıdan listelenen adresler için simülasyon sonrası hesap durumunu döndürmesini ister. Bakiye değişimini sadece yönerge şeklinden tahmin etmeye çalışmaktan çok daha doğru.

Simülasyon tuzakları

  • CLMM swapleri geçerli tick dizileri gerektirir. Kullanıcının giriş boyutu başlatılmamış bir tick dizisine geçerse, simülasyon geri alır (yürütme ile aynı). Bunu açıkça arayüzde gösterin.
  • Öncelik ücreti. Simülasyon, uygulanmış hesaplama bütçesi yönergeleri olmadan çalışır. Varsayılan 200k CU’yu aşan büyük bir işlem için simülasyon başarısız olur, ancak açık bir CU sınırı ile gerçek yürütme başarılı olur. Simülasyona yapılan işlemde de CU sınırını her zaman ayarlayın.
  • Taze blockhash. Simülasyon geçerli blockhash’i kullanır; imzalama 60 saniyeden fazla sürerse işlem geçersiz hale gelir. Kullanıcı duraksamazsa yeniden simülasyon yapın.

Token-2022 görüntüleme

Token-2022 programı altındaki tokenlerin, farklı risk yüzeylerine sahip oldukları için cüzdanın token listesinde bu şekilde etiketlenmesi gerekir:
  • Transfer-ücret mint’leri: mevcut transferFeeBasisPoints’i bakiyenin yanında “Transfer ücretine: X%” olarak gösterin. Alırken uyarı yapın — kullanıcılar gönderenin gönderdiklerinden daha azını alacaklarını fark etmeyebilirler.
  • Transfer-hook mint’leri: hook programı kimliğini gösterin. Kötü amaçlı bir hook giden transferleri engelleyebilir; kullanıcılar hook’un bekledikleri olduğunu doğrulamalıdırlar.
  • Aktarılmayan mint’ler: “Aktarılamaz” gösterin ve swap/göndermeyi devre dışı bırakın. Bunlar tipik olarak soulbound tokenleri veya kimlik bilgileridir.
  • Faiz getiren mint’ler: TokenAccount.amount’tan türetilen arayüz bakiyesi tahakkuk eden faizi yansıtmaz. Gösterilen değer için @solana/spl-token’dan amountToUiAmount kullanın (ölçek faktörünü uygular).

Çiftçilik APR görüntüsü

Kullanıcılara gösterilen APR, tüm canlı ödül akışlarını birleştirmeli, USD’ye dönüştürmeli ve annualize etmelidir:
let apr = 0;
for (const r of farm.rewardInfos) {
  if (r.rewardState !== 1) continue;   // çalışmayanları atla
  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% olarak gösterin. Hisse mint’i bir LP token’i ise, temel LP’nin temel ücret APR’sini de hesaplayın ve toplamı “Toplam APR” veya “APR + ücretler” olarak etiketleyin.

İşaretçiler

Kaynaklar:
  • Raydium SDK v2 — pozisyon/çiftçilik yardımcıları.
  • api-v3.raydium.io’daki kullanıcı-pozisyon uç noktaları.