Ana içeriğe atla
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 →
Sürüm bilgisi.
  • SDK: @raydium-io/raydium-sdk-v2@0.2.42-alpha
  • Cluster: Solana mainnet-beta
  • Stable AMM program ID: 5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h (bkz. reference/program-addresses)
  • Son doğrulama: 2026-04
SDK’nın liquidity modülü Stable AMM havuzlarını yerel olarak destekler. Stable havuzlar ApiV3PoolInfoStandardItem üzerinde version: 5 (veya pooltype: "StablePool") olarak görünür; AMM v4 (version: 4) sabit-ürün havuzları için olduğu gibi aynı addLiquidity / removeLiquidity / swap yardımcıları bunlar için de çalışır — SDK varyantı algılar ve doğru talimatları otomatik olarak yayınlar. Zincir dışı stable-curve matematiği src/raydium/liquidity/stable.ts içinde yer alır.

Kurulum

npm install @raydium-io/raydium-sdk-v2 @solana/web3.js @solana/spl-token
import { Raydium, TxVersion } from "@raydium-io/raydium-sdk-v2";
import { Connection, Keypair, clusterApiUrl } from "@solana/web3.js";
import BN from "bn.js";
import bs58 from "bs58";

const connection = new Connection(clusterApiUrl("mainnet-beta"));
const owner = Keypair.fromSecretKey(bs58.decode(process.env.PRIVATE_KEY!));

const raydium = await Raydium.load({
  connection,
  owner,
  cluster: "mainnet",
  // İsteğe bağlı: `liquidity/stable.ts` dosyasından alıntı
  // yardımcılarını doğrudan çağırmayı düşünüyorsanız stable curve model layout'ını yükleyin.
  // Havuz düzeyinde swap / add / remove bunu sizin için tembel yükleme yapar,
  // bu nedenle çoğu çağıran bu adımı atlayabilir.
});

// Tek seferlik: zincir dışı stable-curve yardımcıları tarafından kullanılan
// zincir üstü model veri layout'ını önceden getirin. Yalnızca getStablePrice / getDxByDyBaseIn /
// getDyByDxBaseIn'i doğrudan çağırırsanız gereklidir. addLiquidity / removeLiquidity / swap buna ihtiyaç duymaz.
await raydium.liquidity.initLayout();

Stable havuzunu tanımlama

ApiV3PoolInfoStandardItem üzerinde iki eşdeğer sinyal:
const isStable =
  pool.version === 5 ||
  pool.pooltype.includes("StablePool"); // SDK bunu dahili olarak kullanır

// Alternatif olarak, program ID'ye göre:
const STABLE_AMM_PROGRAM_ID = "5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h";
const isStableByProgram = pool.programId === STABLE_AMM_PROGRAM_ID;
Hem AMM v4 (version: 4, sabit-ürün) hem de Stable AMM (version: 5) SDK’daki aynı LiquidityModule API’sinden geçer. Dahili olarak modül şu şekilde dağıtılır:
  • v4 havuzları için InstructionType.AmmV4AddLiquidity / AmmV4RemoveLiquidity
  • v5 (Stable) havuzları için InstructionType.AmmV5AddLiquidity / AmmV5RemoveLiquidity
Havuzun programId’si (havuz anahtarlarıyla döndürülür) SDK’ya hangi programa CPI yapacağını söyler; bunu sabit kodlamanız gerekmez.

Mint çiftine göre havuz bulma

import { PublicKey } from "@solana/web3.js";

// Örnek olarak kullanılacak iki yaygın mint
const mintA = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); // USDT
const mintB = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); // USDC

const pools = await raydium.api.fetchPoolByMintPair({
  mint1: mintA.toBase58(),
  mint2: mintB.toBase58(),
});

const stablePool = pools.find(
  (p) => p.version === 5 || p.pooltype.includes("StablePool"),
);

if (!stablePool) {
  throw new Error("Bu mint çifti için Stable havuz yok");
}

console.log("Stable havuz id:", stablePool.id);
console.log("Stable havuz programId:", stablePool.programId);
console.log("TVL:", stablePool.tvl);
Mint çiftinin hem v4 (sabit-ürün) havuzu hem de v5 (stable) havuzu varsa, yanıt her ikisini de içerir — akışınızın ihtiyaç duyduğu havuzu seçin veya AMM Routing programına verin ve en iyi rotayı seçmesine izin verin.

Stable havuz aracılığıyla swap yapma

LiquidityModule.swap akışı v4 havuzları için olduğu gibi aynı şekildedir — ona bir v5 havuz nesnesi verin:
import { Percent, TokenAmount, toToken } from "@raydium-io/raydium-sdk-v2";

const inputAmount = new TokenAmount(toToken(stablePool.mintA), 1_000_000); // 1 USDT
const slippage = new Percent(50, 10_000); // 0.5%

// SDK'nın stable-curve yardımcılarını kullanarak beklenen çıktıyı hesaplayın.
const { amountOut, minAmountOut } = raydium.liquidity.computeAmountOut({
  poolInfo: stablePool,
  amountIn: inputAmount,
  mintIn:  stablePool.mintA.address,
  mintOut: stablePool.mintB.address,
  slippage,
});

console.log("Beklenen çıktı:", amountOut.toSignificant());
console.log("Minimum çıktı:", minAmountOut.toSignificant());

// Swap işlemini oluşturun ve imzalayın.
const { transaction, execute } = await raydium.liquidity.swap({
  poolInfo: stablePool,
  amountIn:    inputAmount.raw,
  amountOut:   minAmountOut.raw,
  fixedSide:   "in",
  txVersion:   TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
console.log("Stable swap tx:", txId);
SDK, havuzun programId’sini havuz anahtarlarından okur ve Stable AMM programına dağıtır. Özel bir programId argümanı gerekmez.

Likidite ekleme ve kaldırma

addLiquidity ve removeLiquidity v4 ve v5 havuzları arasında aynı şekilde çalışır:
import { Percent, TokenAmount, toToken } from "@raydium-io/raydium-sdk-v2";

const amountInA = new TokenAmount(toToken(stablePool.mintA), 100_000_000); // 100 USDT
const slippage  = new Percent(50, 10_000); // 0.5%

// Eğri bu A boyutu için gereken eşleşen B miktarını hesaplayın.
const { anotherAmount, minAnotherAmount } = raydium.liquidity.computePairAmount({
  poolInfo: stablePool,
  amount:   amountInA.toSignificant(),
  baseIn:   true,
  slippage,
});

const { execute } = await raydium.liquidity.addLiquidity({
  poolInfo: stablePool,
  amountInA,
  amountInB:      anotherAmount,
  otherAmountMin: minAnotherAmount,
  fixedSide:      "a",
  txVersion:      TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
console.log("Likidite ekleme tx:", txId);
Dahili olarak SDK InstructionType.AmmV5AddLiquidity yayınlar çünkü pooltype.includes("StablePool") doğrudur. Karşılık gelen removeLiquidity akışı simetrik — lpAmount ve her bir tarafta kabul edeceğiniz minimum miktarları girin.

Zincir dışı alıntı yardımcıları (stable.ts)

Sunucu tarafı alıntılaması veya geriye dönük test için SDK, temel stable-curve matematiğini ortaya çıkarır:
import {
  getStablePrice,
  getDxByDyBaseIn,
  getDyByDxBaseIn,
} from "@raydium-io/raydium-sdk-v2";

// Bu işlevleri kullanmadan önce initLayout() öğesini bir kez çağırmalısınız
// (zincir üstü `ModelDataInfo` PDA'sını SDK'nın StableLayout önbelleğine yükler).
await raydium.liquidity.initLayout();

const modelData = raydium.liquidity.stableLayout;

// Havuzun mevcut rezervlerinde spot fiyat.
const price = getStablePrice(modelData, /* x */, /* y */, /* withFee */);
console.log("Spot fiyat:", price);

// Alıntı: dx giriş verildiğinde, ne kadar dy çıkış (ücret uygulanmaz)?
const dyOut = getDyByDxBaseIn(modelData, /* x */, /* y */, /* dx */);

// Alıntı: dy çıkış hedefi verildiğinde, ne kadar dx giriş gerekli?
const dxIn  = getDxByDyBaseIn(modelData, /* x */, /* y */, /* dy */);
Bunlar saf işlevlerdir — RPC yok, imzalama yok. Zincir üstü ModelDataInfo initLayout() tarafından bir kez getirilir ve raydium.liquidity.stableLayout içinde önbelleğe alınır. Mevcut rezervleri (x, y) geçin ve yardımcılar arama tablosunu ikili arama yaparak ve iki çevreleyen DataElement satırı arasında doğrusal olarak enterpolasyon yaparak hesaplar. Temel algoritma için products/stable/math bölümüne bakın.

AMM Routing aracılığıyla yönlendirme (çok atlamalı / en iyi fiyat)

Bir mekanı kendiniz seçmek istemiyorsanız, AMM Routing programı her Raydium AMM’yi (v4 / CPMM / CLMM / Stable) dikkate alacak ve en iyi olan kombinasyon aracılığıyla yönlendirecektir:
const route = await raydium.tradeV2.fetchRoutes({
  inputMint:  mintA,
  outputMint: mintB,
  amount:     new BN(1_000_000),
  slippage,
});

// route.routes[0].poolType size en iyi rotanın hangi programları kullandığını söyler;
// "Stable" en iyi yolun bir parçası olduğunda burada görünür.
console.log(route.routes[0]);

const { execute } = await raydium.tradeV2.swap({
  inputMint:    mintA,
  outputMint:   mintB,
  inputAmount:  new BN(1_000_000),
  swapResult:   route.routes[0],
  slippage,
  txVersion:    TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
Bu, üretim swapları ve toplayıcılar için önerilen yoldur — Stable havuzunun var olup olmadığını veya bugün daha iyi bir mekan olup olmadığını manuel olarak karar vermeniz gerekmez.

Öneriler

  1. Son kullanıcı swapları için, tradeV2 yönlendirme akışını tercih edin. Stable dahil her Raydium havuz türünü işler.
  2. Havuz özel işlemler için (bilinen bir Stable havuzda LP ekleme / kaldırma), LiquidityModule’ü doğrudan kullanın — v5 havuzlarını otomatik olarak algılar.
  3. Zincir dışı alıntılama / analitik için, initLayout() sonrasında getStablePrice / getDyByDxBaseIn / getDxByDyBaseIn öğesini çağırın. Model verileri önbelleğe alındıktan sonra alıntı başına RPC trafiği yok.
  4. Ham SwapBaseIn talimatlarını elle kodlamayın. 2026-06-22 yükseltmesi ölü OpenBook hesaplarını kaldırdı, bu nedenle yeni swap düzeni 9 hesap alır (eski 18 hesaplı düzen geriye dönük uyumluluk için hala ayrıştırılır). Deposit artık 12 hesap (eski 14 uyumlu), Withdraw 12 (eski 21/22 uyumlu) ve WithdrawPnl 10 uyumluluk yolu yok. SDK’nın önceden oluşturulmuş yardımcıları doğru düzeni ve sıralamayı seçer; kendi kodunuzu yazmak hata yapmaya açıktır. Tam hesap tabloları için products/stable/instructions bölümüne bakın.

Sonraki adımlar

  • Math — arama tablosu enterpolasyonunun nasıl çalıştığı.
  • Instructions — tam talimat referansı.
  • AMM Routing — AMM v4, CPMM, CLMM, Stable arasında çok havuzlu yönlendirme.
Kaynaklar: