> ## 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.

# Stable AMM kod örnekleri

> API'den Stable AMM havuzunu tanımlama, Liquidity modülü aracılığıyla swap yapma (v5 havuzlarını yerel olarak destekler) ve zincir dışı stable-curve yardımcılarını kullanma.

<Info>
  **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 →](/products/stable/code-demos)
</Info>

<Info>
  **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`](/tr/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.
</Info>

## Kurulum

```bash theme={null}
npm install @raydium-io/raydium-sdk-v2 @solana/web3.js @solana/spl-token
```

```ts theme={null}
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:

```ts theme={null}
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

```ts theme={null}
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](/tr/products/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:

```ts theme={null}
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:

```ts theme={null}
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:

```ts theme={null}
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`](/tr/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](/tr/products/routing) programı her Raydium AMM'yi (v4 / CPMM / CLMM / Stable) dikkate alacak ve en iyi olan kombinasyon aracılığıyla yönlendirecektir:

```ts theme={null}
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`](/tr/products/routing) 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](/tr/reference/changelog) ö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`](/tr/products/stable/instructions) bölümüne bakın.

## Sonraki adımlar

* [Math](/tr/products/stable/math) — arama tablosu enterpolasyonunun nasıl çalıştığı.
* [Instructions](/tr/products/stable/instructions) — tam talimat referansı.
* [AMM Routing](/tr/products/routing) — AMM v4, CPMM, CLMM, Stable arasında çok havuzlu yönlendirme.

Kaynaklar:

* [`raydium-sdk-V2/src/raydium/liquidity/liquidity.ts`](https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/raydium/liquidity/liquidity.ts) — modül giriş noktası; v4 / v5 dağıtımı.
* [`raydium-sdk-V2/src/raydium/liquidity/stable.ts`](https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/raydium/liquidity/stable.ts) — `StableLayout`, `getStablePrice`, `getDxByDyBaseIn`, `getDyByDxBaseIn`.
