Langsung ke konten utama

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.

Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Versi banner. Semua demo menargetkan @raydium-io/raydium-sdk-v2@0.2.42-alpha terhadap Solana mainnet-beta, diverifikasi 2026-04. Program ID: 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 (lihat reference/program-addresses).
Pembuatan pool baru tidak ditampilkan di sini. UI Raydium tidak lagi menawarkan pembuatan pool AMM v4 — pasangan baru default ke CPMM. Program AMM v4 itu sendiri masih menerima Initialize2 on-chain; hanya saja bukan jalur yang direkomendasikan. Demo di bawah mencakup operasi pool aktif yang masih dibutuhkan setiap integrator: swap, deposit, withdraw.

Setup

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

Ambil pool berdasarkan id

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

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

// Tarik objek pool yang dinormalisasi SDK. Untuk AMM v4 ini mencakup akun OpenBook
// yang akan dibutuhkan oleh instruction builder.
const data = await raydium.liquidity.getPoolInfoFromRpc({ poolId });
const { poolInfo, poolKeys, poolRpcData } = data;

console.log("Pair:", poolInfo.mintA.symbol, "/", poolInfo.mintB.symbol);
console.log("Version:", poolInfo.version);       // 4 untuk AMM v4
console.log("Market:", poolKeys.marketId.toBase58());
poolKeys adalah struct yang dikonsumsi oleh instruction builder. Ini membawa setiap akun AMM v4 dan OpenBook dalam urutan yang diharapkan program.

Swap (base-in)

import BN from "bn.js";

const amountIn = new BN(1_000_000);            // 1 USDC (quote 6-desimal)
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 menambahkan setiap akun OpenBook secara otomatis. Jangan coba menggantinya dengan tangan — program memvalidasi setiap slot.

Swap (base-out)

const amountOut = new BN(1_000_000_000);       // 1 SOL (base 9-desimal)
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 });

Tambah likuiditas

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" memberi tahu SDK bahwa Anda menyuplai amountInA yang tepat dan amountInB harus paling banyak maxAnotherAmount. Likuiditas on-book pool diselesaikan sebelum matematika pro-rata sehingga rasio deposit cocok dengan cadangan terakhir.

Hapus likuiditas

const lpAmount = new BN(50_000);               // LP untuk dibakar

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 minimum melindungi terhadap perubahan state pool antara pre-quote dan waktu land Anda.

Penyetelan biaya komputasi / prioritas

Swap AMM v4 berat pada komputasi karena setiap instruksi memvalidasi keseluruhan state OpenBook. Swap tipikal menggunakan 180k–250k CU tergantung berapa banyak open order yang perlu diselesaikan. Selalu sertakan batas unit komputasi:
import { ComputeBudgetProgram } from "@solana/web3.js";

const { execute, innerTransactions } = await raydium.liquidity.swap({
  /* ...params... */
  computeBudgetConfig: {
    units: 400_000,
    microLamports: 50_000,       // biaya prioritas
  },
});
Jika Anda menghilangkan computeBudgetConfig, SDK mungkin masih menggunakan defaultnya sendiri; periksa innerTransactions untuk mengonfirmasi. Lihat integration-guides/priority-fee-tuning.

CPI Rust Langsung

Jika Anda harus CPI ke AMM v4 dari program Anchor Anda sendiri, Anda perlu membuat model daftar akun SwapBaseIn secara verbatim. Sketsa minimal:
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<()> {
    // Discriminator instruksi untuk SwapBaseIn adalah 9 di AMM v4.
    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 tidak mengirimkan crate Anchor untuk CPI. Sketsa di atas menggunakan Instruction yang dibangun secara manual.

Perangkap Umum

  • Akun OpenBook yang hilang. Semua 8 akun sisi OpenBook diperlukan di setiap swap, deposit, dan withdraw; SDK menangani ini, instruksi yang dibangun tangan sering tidak.
  • Membaca saldo vault mentah. Tidak mencerminkan jumlah yang disimpan on-book atau akumulasi PnL. Gunakan quote SDK atau api-v3.raydium.io/pools/info/ids.
  • Antrian acara OpenBook penuh. Pool mungkin mengembalikan swap dengan SerumOrderError ketika antrian acara pasarnya memerlukan cranking. Cranking adalah permissionless (MonitorStep di akun OpenBook pasar).
  • Mint Token-2022. Tidak didukung. Pool AMM v4 tidak dapat dibuat dengan mint Token-2022; pasangan Token-2022 apa pun harus berada di CPMM atau CLMM.

Ke mana selanjutnya

Sumber: