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

# CPMM kod örnekleri

> Her CPMM işlemi için uçtan uca TypeScript örnekleri — havuz oluşturma, swap yapma, likidite yatırma, çekme, işlem ücretlerini toplama — artı minimal Rust CPI iskeletine sahip.

<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/cpmm/code-demos)
</Info>

<Info>
  **Sürüm notu.** Tüm TypeScript örnekleri `@raydium-io/raydium-sdk-v2@0.2.42-alpha` sürümünü hedefler ve Solana mainnet-beta'ya karşı doğrulanmıştır (2026-04). Rust CPI iskeleti `raydium-cp-swap`'ın `master` dalında (Anchor `0.30.x`) hedefler. Program ID'leri [`reference/program-addresses`](/tr/reference/program-addresses) dosyasındaki sabitlerden alınır.
</Info>

## Ön koşullar

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

Bu sayfadaki her örnek [`raydium-sdk-V2-demo/src/cpmm`](https://github.com/raydium-io/raydium-sdk-V2-demo/tree/master/src/cpmm) deposundaki bir dosyayı yansıtır; GitHub bağlantısı her bölümün yanında yer alır. Önyükleme, demo deposunun `config.ts.template` dosyasını takip eder ([kaynak](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/config.ts.template)):

```ts theme={null}
import { Connection, Keypair, clusterApiUrl } from "@solana/web3.js";
import { Raydium, TxVersion } from "@raydium-io/raydium-sdk-v2";
import fs from "node:fs";

const connection = new Connection(process.env.RPC_URL ?? clusterApiUrl("mainnet-beta"));
const owner = Keypair.fromSecretKey(
  new Uint8Array(JSON.parse(fs.readFileSync(process.env.KEYPAIR!, "utf8"))),
);

const raydium = await Raydium.load({
  owner,
  connection,
  cluster: "mainnet",
  disableFeatureCheck: true,
  blockhashCommitment: "finalized",
});
```

`Raydium` örneği SDK'nın temel arayüzüdür — aşağıdaki tüm örnekler bunu kullanır. Token listelerini ve ücret konfigürasyonlarını `api-v3.raydium.io` adresinden tembel olarak getirir; çevrimdışı ortamlarda kendi verilerinizle tohumlandırabilirsiniz.

## CPMM havuzu oluşturma

Kaynak: [`src/cpmm/createCpmmPool.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/cpmm/createCpmmPool.ts)

```ts theme={null}
import { PublicKey } from "@solana/web3.js";
import BN from "bn.js";
import { getCpmmPdas, CREATE_CPMM_POOL_PROGRAM, CREATE_CPMM_POOL_FEE_ACC }
  from "@raydium-io/raydium-sdk-v2";

const mintA = new PublicKey("So11111111111111111111111111111111111111112"); // wSOL
const mintB = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); // USDC

// 1. Ücret konfigürasyonu seçin. index=0, %0.25 katmanıdır.
const feeConfigs = await raydium.api.getCpmmConfigs();
const feeConfig  = feeConfigs.find((c) => c.index === 0)!;

// 2. Mint meta verilerini alın; SDK, Token-2022 uzantılarını işleyebilsin diye.
const mintAInfo = await raydium.token.getTokenInfo(mintA);
const mintBInfo = await raydium.token.getTokenInfo(mintB);

// 3. İşlemi oluşturun.
const { execute, extInfo } = await raydium.cpmm.createPool({
  programId:       CREATE_CPMM_POOL_PROGRAM,
  poolFeeAccount:  CREATE_CPMM_POOL_FEE_ACC,
  mintA:           mintAInfo,
  mintB:           mintBInfo,
  mintAAmount:     new BN(1_000_000_000),   // 1 SOL (9 ondalık değer varsayılır)
  mintBAmount:     new BN(   160_000_000),  // 160 USDC (SOL başına 160)
  startTime:       new BN(0),               // hemen aç
  feeConfig,
  associatedOnly:  false,
  ownerInfo:       { useSOLBalance: true },
  txVersion:       TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
console.log("Havuz oluşturuldu:", extInfo.address.poolId.toBase58());
console.log("İşlem:", txId);
```

SDK'nın sessizce hallettiği birkaç şey:

* Mint'leri PDA türetmeden önce token0/token1 sırasına göre sıralama.
* Tek seferlik `create_pool_fee`'yi `poolFeeAccount`'a ödeme.
* Çağıranın ilişkili token hesaplarını eksikse oluşturma.
* Her bir taraf için doğru token programını seçme (SPL Token vs Token-2022).

Onaylandıktan sonra canlı havuz durumunu şu şekilde getirebilirsiniz:

```ts theme={null}
const { poolKeys, poolInfo, rpcData } = await raydium.cpmm.getPoolInfoFromRpc(
  extInfo.address.poolId,
);
```

## Swap (base-input)

Kaynak: [`src/cpmm/swap.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/cpmm/swap.ts)

```ts theme={null}
import { CurveCalculator } from "@raydium-io/raydium-sdk-v2";

const poolId = new PublicKey("<POOL_ID>");

// 1. Güncel havuz durumunu doğrudan RPC'den yükleyin (API'den değil).
const { poolInfo, poolKeys, rpcData } = await raydium.cpmm.getPoolInfoFromRpc(poolId);

const inputMint  = new PublicKey(poolInfo.mintA.address); // A → B swap
const amountIn   = new BN(100_000_000);                   // 0.1 SOL
const slippage   = 0.005;                                 // %0.5

// 2. Yerel olarak fiyat alın. SDK'nın CurveCalculator, zincir üstü matematiği yansıtır;
//    her iki tarafta da Token-2022 transfer ücretlerini içerir.
const baseIn = inputMint.equals(new PublicKey(poolInfo.mintA.address));
const swapResult = CurveCalculator.swap(
  amountIn,
  baseIn ? rpcData.baseReserve : rpcData.quoteReserve,
  baseIn ? rpcData.quoteReserve : rpcData.baseReserve,
  rpcData.configInfo!.tradeFeeRate,
);
const minimumAmountOut =
  swapResult.destinationAmountSwapped.muln(1 - slippage * 100).divn(100);

// 3. Oluşturun ve gönderin.
const { execute } = await raydium.cpmm.swap({
  poolInfo,
  poolKeys,
  inputAmount: amountIn,
  swapResult,
  slippage,
  baseIn,
  txVersion: TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
console.log("Swap işlemi:", txId);
```

Not: SDK **her zaman** `getPoolInfoFromRpc` içinde havuz durumunu RPC'den yeniden getirir. İmzalamak üzere olduğunuz bir işlem için `api-v3.raydium.io`'dan fiyat almayın — bir blok eski bir fiyat, zincire konduğunda `ExceededSlippage` ile kayabilir.

## Swap (base-output)

Kaynak: [`src/cpmm/swapBaseOut.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/cpmm/swapBaseOut.ts)

```ts theme={null}
const amountOutWanted = new BN(15_000_000);        // 15 USDC
const slippage        = 0.005;

const baseIn = false; // B giriş, A çıkış mı? yönünüze bağlı
const swapResult = CurveCalculator.swapBaseOutput(
  amountOutWanted,
  rpcData.baseReserve,
  rpcData.quoteReserve,
  rpcData.configInfo!.tradeFeeRate,
);
const maxAmountIn = swapResult.sourceAmountSwapped.muln(1 + slippage * 100).divn(100);

const { execute } = await raydium.cpmm.swap({
  poolInfo,
  poolKeys,
  inputAmount: maxAmountIn,
  fixedOut:    true,
  amountOut:   amountOutWanted,
  baseIn,
  slippage,
  txVersion:   TxVersion.V0,
});

await execute({ sendAndConfirm: true });
```

## Likidite yatırma

Kaynak: [`src/cpmm/deposit.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/cpmm/deposit.ts)

```ts theme={null}
const lpAmount = new BN(100_000);           // istenen LP mint tutarı
const slippage = 0.01;

const { execute } = await raydium.cpmm.addLiquidity({
  poolInfo,
  poolKeys,
  lpAmount,
  slippage,
  baseIn: true,           // mintA tarafından fiyat alın
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
```

SDK, `lpAmount`'u havuzun güncel rezervlerine göre `needed_token_0` ve `needed_token_1`'e dönüştürür, her birini talimatın `maximum_*` argümanları için `1 + slippage` ile şişirir ve gerekli ATA oluşturmalarını yapar.

## Likidite çekme

Kaynak: [`src/cpmm/withdraw.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/cpmm/withdraw.ts)

```ts theme={null}
const lpAmount = new BN(100_000);           // yakılacak LP
const slippage = 0.01;

const { execute } = await raydium.cpmm.withdrawLiquidity({
  poolInfo,
  poolKeys,
  lpAmount,
  slippage,
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
```

## Protokol/fon/yaratıcı ücretlerini toplama

Kaynak: [`src/cpmm/collectCreatorFee.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/cpmm/collectCreatorFee.ts), [`src/cpmm/collectAllCreatorFee.ts`](https://github.com/raydium-io/raydium-sdk-V2-demo/blob/master/src/cpmm/collectAllCreatorFee.ts)

Bu talimatlar yönetici veya yaratıcı tarafından kısıtlı ve tipik olarak Raydium çoklu imzasından veya havuz yaratıcısından tutulan bir imzacı tarafından çağrılır. SDK bunları ham derleyiciler olarak yüzeylendirir:

```ts theme={null}
import {
  makeCollectProtocolFeeInstruction,
  makeCollectFundFeeInstruction,
  makeCollectCreatorFeeInstruction,
} from "@raydium-io/raydium-sdk-v2";

// PDA'lar ve yetki, havuz oluşturma sırasında ayarlanmıştır; 
// kanonik seed'ler için reference/program-addresses bölümüne bakın.
// SDK, tercih ederseniz yardımcı sağlar.
```

Zincir dışında biriken ücretleri doğrudan `PoolState`'ten okuyabilirsiniz:

```ts theme={null}
const pool = await raydium.cpmm.getRpcPoolInfo(poolId);
console.log("Biriken protokol ücreti token0:", pool.protocolFeesToken0.toString());
console.log("Biriken protokol ücreti token1:", pool.protocolFeesToken1.toString());
```

## Rust CPI iskeleti

Kendi Anchor programınızdan CPMM'yi çağırmak istiyorsanız — örneğin, mevduat sahipleri adına swap yapan bir kasa — CPI bağlamı şöyle görünür. Hesap sırası [`products/cpmm/instructions`](/tr/products/cpmm/instructions) takip eder.

```rust theme={null}
// Cargo.toml
// raydium-cp-swap = { git = "https://github.com/raydium-io/raydium-cp-swap" }
// anchor-spl       = "0.30"

use anchor_lang::prelude::*;
use anchor_spl::token_interface::{TokenAccount, TokenInterface, Mint};
use raydium_cp_swap::cpi::accounts::Swap;
use raydium_cp_swap::cpi;
use raydium_cp_swap::program::RaydiumCpSwap;

#[derive(Accounts)]
pub struct ProxySwap<'info> {
    #[account(mut)]
    pub payer: Signer<'info>,

    /// CHECK: CPMM programı tarafından doğrulandı
    pub authority:     UncheckedAccount<'info>,
    /// CHECK:
    pub amm_config:    UncheckedAccount<'info>,
    #[account(mut)]
    /// CHECK:
    pub pool_state:    UncheckedAccount<'info>,

    #[account(mut)]
    pub input_token_account:  InterfaceAccount<'info, TokenAccount>,
    #[account(mut)]
    pub output_token_account: InterfaceAccount<'info, TokenAccount>,

    #[account(mut)]
    pub input_vault:  InterfaceAccount<'info, TokenAccount>,
    #[account(mut)]
    pub output_vault: InterfaceAccount<'info, TokenAccount>,

    pub input_token_program:  Interface<'info, TokenInterface>,
    pub output_token_program: Interface<'info, TokenInterface>,

    pub input_token_mint:  InterfaceAccount<'info, Mint>,
    pub output_token_mint: InterfaceAccount<'info, Mint>,

    #[account(mut)]
    /// CHECK: halka tamponu
    pub observation_state: UncheckedAccount<'info>,

    pub cpmm_program: Program<'info, RaydiumCpSwap>,
}

pub fn proxy_swap_base_input(
    ctx: Context<ProxySwap>,
    amount_in: u64,
    minimum_amount_out: u64,
) -> Result<()> {
    let cpi_accounts = Swap {
        payer:                ctx.accounts.payer.to_account_info(),
        authority:            ctx.accounts.authority.to_account_info(),
        amm_config:           ctx.accounts.amm_config.to_account_info(),
        pool_state:           ctx.accounts.pool_state.to_account_info(),
        input_token_account:  ctx.accounts.input_token_account.to_account_info(),
        output_token_account: ctx.accounts.output_token_account.to_account_info(),
        input_vault:          ctx.accounts.input_vault.to_account_info(),
        output_vault:         ctx.accounts.output_vault.to_account_info(),
        input_token_program:  ctx.accounts.input_token_program.to_account_info(),
        output_token_program: ctx.accounts.output_token_program.to_account_info(),
        input_token_mint:     ctx.accounts.input_token_mint.to_account_info(),
        output_token_mint:    ctx.accounts.output_token_mint.to_account_info(),
        observation_state:    ctx.accounts.observation_state.to_account_info(),
    };
    let cpi_ctx = CpiContext::new(
        ctx.accounts.cpmm_program.to_account_info(),
        cpi_accounts,
    );
    cpi::swap_base_input(cpi_ctx, amount_in, minimum_amount_out)
}
```

CPI'niz bir PDA olarak imzalarsa (örneğin, mevduat sahipleri adına bir kasayı yönetiyorsanız), `CpiContext::new` yerine `CpiContext::new_with_signer` kullanın ve seed'lerinizi geçin.

## Yaygın tuzaklar

Bir destek talebinde açmadan önce kısa bir kontrol listesi:

* **Sıralanmış mint'ler.** Türetilen `poolState` PDA'nız zincir üstü havuzla eşleşmiyorsa, muhtemelen mint'leri sıralamayı unuttunuz.
* **Eski API fiyatı.** Asla `api-v3.raydium.io`'dan bir rezerv değerini `CurveCalculator.swap` içine geçmeyin. RPC'den alın.
* **Yanlış token programı.** Token-2022 mint'inin kasası SPL Token tarafından değil, Token-2022 programı tarafından sahiplenilir. Her zaman havuzun `token_0_program` / `token_1_program` alanlarını kullanın.
* **Transfer-fee mint'leri için eksik slippage.** Havuzun her iki tarafı da Token-2022 transfer-fee mint'iyse, `minimum_amount_out`'unuz kasanın gönderdiği şeyde değil, kullanıcının aldığında yer almalıdır.
* **Swap'ta `NotApproved`.** `PoolState.status`'u kontrol edin — yönetici o havuzdaki swap'ları duraklatmış olabilir. Durum bitmask'ı için [`products/cpmm/instructions`](/tr/products/cpmm/instructions) bölümüne bakın.

## Sonraki adımlar

* [`sdk-api/typescript-sdk`](/tr/sdk-api/typescript-sdk) — tam SDK referansı.
* [`sdk-api/rest-api`](/tr/sdk-api/rest-api) — fiyat ve havuz-metadata uç noktaları.
* [`user-flows/create-cpmm-pool`](/tr/user-flows/create-cpmm-pool) — aynı akışın kod olmayan açıklaması.
* [`integration-guides/aggregator`](/tr/integration-guides/aggregator) — CPMM'yi çok atlamalı bir yolun parçası olarak yönlendiriliyorsanız.

Kaynaklar:

* [Raydium SDK v2 — `@raydium-io/raydium-sdk-v2`](https://github.com/raydium-io/raydium-sdk-V2)
* [Raydium SDK v2 demo'ları — `raydium-sdk-v2-demo`](https://github.com/raydium-io/raydium-sdk-V2-demo)
* [`raydium-io/raydium-cp-swap`](https://github.com/raydium-io/raydium-cp-swap)
