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 →
Bunu ne yapar? CPMM pool’u RPC’den yükler, %0,5 slippage ile swap’i fiyatlandırır, işlemi derler, anahtar çiftinizle imzalar ve gönderir. Başından sonuna kadar ~30 satırda.

Kurulum

Hızlı başlangıç önkoşullarını okuduğunuzdan ve RPC_URL, KEYPAIR ve bağımlılıkları yüklediğinizden emin olun.

Script

swap.mjs olarak kaydedin:
// swap.mjs
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import { Raydium, TxVersion, CurveCalculator } from "@raydium-io/raydium-sdk-v2";
import BN from "bn.js";
import fs from "node:fs";

// ── Config from env ──────────────────────────────────────────────
const RPC_URL    = process.env.RPC_URL    ?? "https://api.mainnet-beta.solana.com";
const KEYPAIR    = process.env.KEYPAIR    ?? `${process.env.HOME}/.config/solana/id.json`;
const POOL_ID    = process.env.POOL_ID;     // required, base58
const INPUT_MINT = process.env.INPUT_MINT;  // required, base58
const AMOUNT_RAW = process.env.AMOUNT_RAW;  // required, integer in raw units (e.g. 1_000_000_000 for 1 SOL)

if (!POOL_ID || !INPUT_MINT || !AMOUNT_RAW) {
  console.error("Set POOL_ID, INPUT_MINT, AMOUNT_RAW env vars.");
  process.exit(1);
}

// ── Setup ────────────────────────────────────────────────────────
const connection = new Connection(RPC_URL, "confirmed");
const owner = Keypair.fromSecretKey(
  new Uint8Array(JSON.parse(fs.readFileSync(KEYPAIR, "utf8"))),
);
const raydium = await Raydium.load({
  owner,
  connection,
  cluster: "mainnet",
  disableFeatureCheck: true,
  blockhashCommitment: "finalized",
});

// ── Load pool ────────────────────────────────────────────────────
const { poolInfo, poolKeys, rpcData } =
  await raydium.cpmm.getPoolInfoFromRpc(new PublicKey(POOL_ID));

const baseIn = poolInfo.mintA.address === INPUT_MINT;

// ── Quote ────────────────────────────────────────────────────────
const inputAmount = new BN(AMOUNT_RAW);
const swapResult  = CurveCalculator.swap(
  inputAmount,
  baseIn ? rpcData.baseReserve : rpcData.quoteReserve,
  baseIn ? rpcData.quoteReserve : rpcData.baseReserve,
  rpcData.configInfo.tradeFeeRate,
);

console.log(`Quote: ${inputAmount.toString()} -> ${swapResult.destinationAmountSwapped.toString()}`);
console.log(`Fee:   ${swapResult.tradeFee.toString()}`);

// ── Build and execute ────────────────────────────────────────────
const { execute } = await raydium.cpmm.swap({
  poolInfo,
  poolKeys,
  inputAmount,
  swapResult,
  slippage: 0.005, // 0.5%
  baseIn,
  txVersion: TxVersion.V0,
  computeBudgetConfig: {
    units: 250_000,
    microLamports: 50_000,
  },
});

const { txId } = await execute({ sendAndConfirm: true });
console.log(`Swap landed: https://solscan.io/tx/${txId}`);

Çalıştırın

Likiditeye sahip olduğunuz herhangi bir CPMM pool’u seçin. Canonical SOL/USDC CPMM pool’u kullanarak örnek:
export POOL_ID="<CPMM pool ID yapıştırın — Raydium UI'ın Pools sekmesinde bulun>"
export INPUT_MINT="So11111111111111111111111111111111111111112"
export AMOUNT_RAW="10000000"   # 0.01 SOL

node swap.mjs
Beklenen çıktı:
Quote: 10000000 -> 1640000
Fee:   25000
Swap landed: https://solscan.io/tx/4Z9...

Ne oldu?

  1. Raydium.load SDK’yı başlattı — global yapılandırmayı getirdi, cüzdan bağlamınızı kurdu.
  2. getPoolInfoFromRpc canlı pool durumunu doğrudan RPC’den çekti (API önbelleğinden değil). Yüksek değerli swaplar için her zaman güncel durumu isteyebilirsiniz.
  3. CurveCalculator.swap havuzun ücretinin net olarak sabit ürün çıktısını hesapladı. Bu, programın zincir üzerinde çalıştırdığı matematikle aynıdır; böylece fiyatlandırmaları zincir dışında ve zincir üzerinde karşılaştırabilirsiniz.
  4. raydium.cpmm.swap işlemi V0 biçimiyle derled (adres arama tabloları etkinleştirildi) ve açık hesaplama bütçesi yapılandırması ekledi. Hesaplama bütçesi bahşişi, işlemi meşgul dönemlerde iniş yaptırmaya yardımcı olur.
  5. execute({ sendAndConfirm: true }) imzaladı, gönderdi ve onaylanmayı bekledi.

Genel hatalar

  • Pool not found — Yanlış POOL_ID veya yanlış kümeye işaret ediyorsunuz (mainnet pool ID’si devnet RPC’ye karşı, vb.).
  • Insufficient funds for transaction — Cüzdanınızda swap girişi + ücretler + ATA kirası için yeterli SOL yok.
  • Slippage tolerance exceeded — Havuzun fiyatı fiyatlandırma ve yürütme arasında değişti. Yeniden çalıştırın; veya slippage parametresini artırın; veya her zaman rezervleri yeniden getiren SDK’nın computeAmountOut’unu kullanın.
  • Token account not initialized — Çıkış token’ının ATA yoktu ve örtük-oluştur talimatı inişe geçti ama başka bir nedenle başarısız oldu; cüzdanınızın SOL bakiyesini kontrol edin ve yeniden deneyin.

Sonraki adımlar