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 →
Sürüm belgesi. Tüm örnekler Solana mainnet-beta üzerinde @raydium-io/raydium-sdk-v2@0.2.42-alpha sürümünü hedefler, 2026-04’te doğrulanmıştır. Program ID: 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 (bkz. reference/program-addresses).
Yeni havuz oluşturma burada gösterilmemektedir. Raydium kullanıcı arayüzü artık AMM v4 havuz oluşturmayı sunmamaktadır — yeni işlem çiftleri CPMM’ye varsayılan olarak ayarlanır. AMM v4 programı kendisi on-chain Initialize2’i hala kabul eder; sadece önerilen yol değildir. Aşağıdaki örnekler her integratörün hala ihtiyaç duyduğu canlı havuz işlemlerini kapsar: swap, deposit, withdraw.

Kurulum

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" });

Bir havuzu ID’ye göre çekme

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

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

// SDK'nın normalleştirilmiş havuz nesnesini çekin. AMM v4 için buna
// komut oluşturucuların ihtiyacı olacak OpenBook hesapları dahildir.
const data = await raydium.liquidity.getPoolInfoFromRpc({ poolId });
const { poolInfo, poolKeys, poolRpcData } = data;

console.log("Çifti:", poolInfo.mintA.symbol, "/", poolInfo.mintB.symbol);
console.log("Sürüm:", poolInfo.version);       // AMM v4 için 4
console.log("Pazar:", poolKeys.marketId.toBase58());
poolKeys, komut oluşturucuların tükettiği yapıdır. Program’ın beklediği sırada her AMM v4 ve OpenBook hesabını içerir.

Swap (base-in)

import BN from "bn.js";

const amountIn = new BN(1_000_000);            // 1 USDC (6 ondalak alıntı)
const inputMint = new PublicKey(poolInfo.mintB.address);  // USDC
const slippage  = 0.005;

const computed = raydium.liquidity.computeAmountOut({
  poolInfo,
  amountIn,
  mintIn: inputMint,
  mintOut: new PublicKey(poolInfo.mintA.address),
  slippage,
});

const { execute } = await raydium.liquidity.swap({
  poolInfo,
  poolKeys,
  amountIn,
  amountOut: computed.minAmountOut,
  fixedSide: "in",
  inputMint,
  txVersion: TxVersion.V0,
});

const { txId } = await execute({ sendAndConfirm: true });
console.log("Swap tx:", txId);
SDK her OpenBook hesabını otomatik olarak ekler. Bunları elle değiştirmeye çalışmayın — program her slotu doğrular.

Swap (base-out)

const amountOut = new BN(1_000_000_000);       // 1 SOL (9 ondalak taban)
const slippage  = 0.005;

const computed = raydium.liquidity.computeAmountIn({
  poolInfo,
  amountOut,
  mintOut: new PublicKey(poolInfo.mintA.address),
  mintIn: new PublicKey(poolInfo.mintB.address),
  slippage,
});

const { execute } = await raydium.liquidity.swap({
  poolInfo,
  poolKeys,
  amountIn: computed.maxAmountIn,
  amountOut,
  fixedSide: "out",
  inputMint: new PublicKey(poolInfo.mintB.address),
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });

Likidite ekleme

const amountA = new BN(100_000_000);           // 0.1 SOL

const { anotherAmount, maxAnotherAmount } = raydium.liquidity.computePairAmount({
  poolInfo,
  amount: amountA,
  baseIn: true,
  slippage: 0.01,
});

const { execute } = await raydium.liquidity.addLiquidity({
  poolInfo,
  poolKeys,
  amountInA: amountA,
  amountInB: maxAnotherAmount,
  fixedSide: "a",
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
fixedSide: "a" SDK’ya tam amountInA değerini sağladığınızı ve amountInB’nin en fazla maxAnotherAmount olması gerektiğini söyler. Havuzun on-book likidliği pro-rata hesaplamasından önce kapatıldığından, deposit oranı en taze rezervleri eşleştirir.

Likiditeyi kaldırma

const lpAmount = new BN(50_000);               // Yakılacak LP

const { execute } = await raydium.liquidity.removeLiquidity({
  poolInfo,
  poolKeys,
  lpAmount,
  baseAmountMin: new BN(0),
  quoteAmountMin: new BN(0),
  txVersion: TxVersion.V0,
});

await execute({ sendAndConfirm: true });
Slippage minimumları havuzun durumunun ön-alıntı ile iniş saati arasında değişmesine karşı koruma sağlar.

Compute-unit / öncelik ücreti ayarlaması

AMM v4 swapları compute açısından ağırdır çünkü her komut tam OpenBook durumunu doğrular. Tipik bir swap, kaç tane açık siparişin yolda kapatılması gerektiğine bağlı olarak 180k–250k CU kullanır. Her zaman bir compute-unit limiti geçin:
import { ComputeBudgetProgram } from "@solana/web3.js";

const { execute, innerTransactions } = await raydium.liquidity.swap({
  /* ...params... */
  computeBudgetConfig: {
    units: 400_000,
    microLamports: 50_000,       // öncelik ücreti
  },
});
computeBudgetConfig’i atarsanız, SDK yine de kendi varsayılanını kullanabilir; onaylamak için innerTransactions’ı inceleyin. Bkz. integration-guides/priority-fee-tuning.

Doğrudan Rust CPI

Kendi Anchor programınızdan AMM v4’e CPI yapmanız gerekiyorsa, SwapBaseIn’in hesap listesini kelimesi kelimesine modellemeniz gerekecektir. Minimal bir taslak:
use anchor_lang::prelude::*;
use anchor_lang::solana_program::program::invoke_signed;
use anchor_lang::solana_program::instruction::Instruction;

const AMM_V4_PROGRAM_ID: Pubkey = pubkey!("675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8");

#[derive(Accounts)]
pub struct ProxyAmmV4Swap<'info> {
    /// CHECK:
    pub token_program: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub amm:          UncheckedAccount<'info>,
    /// CHECK:
    pub amm_authority: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub amm_open_orders: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub amm_target_orders: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub pool_coin_token_account: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub pool_pc_token_account: UncheckedAccount<'info>,
    /// CHECK:
    pub market_program: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub market: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub market_bids: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub market_asks: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub market_event_queue: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub market_coin_vault: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub market_pc_vault: UncheckedAccount<'info>,
    /// CHECK:
    pub market_vault_signer: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub user_source: UncheckedAccount<'info>,
    #[account(mut)] /// CHECK:
    pub user_dest: UncheckedAccount<'info>,
    pub user_owner: Signer<'info>,
}

pub fn proxy_swap(
    ctx: Context<ProxyAmmV4Swap>,
    amount_in: u64,
    minimum_amount_out: u64,
) -> Result<()> {
    // SwapBaseIn için komut ayırt edici AMM v4'te 9'dur.
    let mut data = vec![9u8];
    data.extend_from_slice(&amount_in.to_le_bytes());
    data.extend_from_slice(&minimum_amount_out.to_le_bytes());

    let ix = Instruction {
        program_id: AMM_V4_PROGRAM_ID,
        accounts: vec![
            AccountMeta::new_readonly(ctx.accounts.token_program.key(), false),
            AccountMeta::new(ctx.accounts.amm.key(), false),
            AccountMeta::new_readonly(ctx.accounts.amm_authority.key(), false),
            AccountMeta::new(ctx.accounts.amm_open_orders.key(), false),
            AccountMeta::new(ctx.accounts.amm_target_orders.key(), false),
            AccountMeta::new(ctx.accounts.pool_coin_token_account.key(), false),
            AccountMeta::new(ctx.accounts.pool_pc_token_account.key(), false),
            AccountMeta::new_readonly(ctx.accounts.market_program.key(), false),
            AccountMeta::new(ctx.accounts.market.key(), false),
            AccountMeta::new(ctx.accounts.market_bids.key(), false),
            AccountMeta::new(ctx.accounts.market_asks.key(), false),
            AccountMeta::new(ctx.accounts.market_event_queue.key(), false),
            AccountMeta::new(ctx.accounts.market_coin_vault.key(), false),
            AccountMeta::new(ctx.accounts.market_pc_vault.key(), false),
            AccountMeta::new_readonly(ctx.accounts.market_vault_signer.key(), false),
            AccountMeta::new(ctx.accounts.user_source.key(), false),
            AccountMeta::new(ctx.accounts.user_dest.key(), false),
            AccountMeta::new_readonly(ctx.accounts.user_owner.key(), true),
        ],
        data,
    };
    invoke_signed(&ix, &ctx.accounts.to_account_infos(), &[])?;
    Ok(())
}
AMM v4, CPI için bir Anchor sandığı sunmaz. Yukarıdaki taslak elle inşa edilen bir Instruction kullanır.

Tuzaklar

  • OpenBook hesabı eksik. 8 OpenBook tarafı hesabının tümü her swap, deposit ve withdraw’da gereklidir; SDK bunu yönetir, elle inşa edilen komutlar çoğunlukla yapmaz.
  • Ham kasa bakiyelerini okuma. On-book kıstırılan tutarları veya tahakkuk eden PnL’yi yansıtmaz. SDK’nın alıntısını veya api-v3.raydium.io/pools/info/ids’ı kullanın.
  • OpenBook olay kuyruğu dolu. Bir havuz, pazarının olay kuyruğunun kırılması gerektiğinde SerumOrderError ile swapları geri çevirebilir. Kırılma izinsizdir (pazar’ın OpenBook hesaplarında MonitorStep).
  • Token-2022 mintleri. Desteklenmemektedir. AMM v4 havuzu Token-2022 minti’ye karşı oluşturulamaz; herhangi bir Token-2022 çifti CPMM veya CLMM’de olmalıdır.

Sonraki adımlar

Kaynaklar: