Zum Hauptinhalt springen

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.

Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Das macht dieses Skript. Lädt einen CPMM-Pool vom RPC, quotiert einen Swap mit 0,5% Slippage, baut die Transaktion, signiert mit Ihrem Keypair und sendet sie ein. End-to-End in etwa 30 Zeilen.

Vorbereitung

Stellen Sie sicher, dass Sie die Quick-Start-Voraussetzungen gelesen haben und RPC_URL, KEYPAIR sowie die erforderlichen Abhängigkeiten installiert sind.

Das Skript

Speichern Sie es als swap.mjs:
// 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}`);

Ausführung

Wählen Sie einen CPMM-Pool aus, für den Sie Liquidität haben. Beispiel mit dem kanonischen SOL/USDC CPMM-Pool:
export POOL_ID="<paste a CPMM pool ID — find one in Raydium UI's Pools tab>"
export INPUT_MINT="So11111111111111111111111111111111111111112"
export AMOUNT_RAW="10000000"   # 0.01 SOL

node swap.mjs
Erwartete Ausgabe:
Quote: 10000000 -> 1640000
Fee:   25000
Swap landed: https://solscan.io/tx/4Z9...

Was ist gerade passiert

  1. Raydium.load initialisiert das SDK — lädt die globale Konfiguration und richtet Ihren Wallet-Kontext ein.
  2. getPoolInfoFromRpc ruft den aktuellen Pool-Status direkt vom RPC ab (nicht aus dem API-Cache). Bei hochpreisigen Swaps möchten Sie immer den aktuellen Status.
  3. CurveCalculator.swap berechnet die Constant-Product-Ausgabe abzüglich der Poolgebühr. Dies ist die gleiche Mathematik, die das Programm On-Chain durchführt, sodass Sie Quotes Off- und On-Chain vergleichen können.
  4. raydium.cpmm.swap erstellt die Transaktion im V0-Format (Address Lookup Tables aktiviert) und fügt eine explizite Compute-Budget-Konfiguration hinzu. Das Compute-Budget-Trinkgeld hilft der Transaktion, in vollen Blöcken bestätigt zu werden.
  5. execute({ sendAndConfirm: true }) signiert, sendet und wartet auf Bestätigung.

Häufige Fehler

  • Pool not found — Falscher POOL_ID, oder Sie sind auf dem falschen Cluster verbunden (Mainnet-Pool-ID gegen einen Devnet-RPC usw.).
  • Insufficient funds for transaction — Ihr Wallet hat nicht genug SOL für die Swap-Eingabe + Gebühren + ATA-Miete.
  • Slippage tolerance exceeded — Der Preis des Pools hat sich zwischen Quote und Ausführung verschoben. Führen Sie das Skript erneut aus, erhöhen Sie den slippage-Parameter, oder verwenden Sie die SDK-Methode computeAmountOut, die immer die Reserven neu abruft.
  • Token account not initialized — Das Output-Token-Konto existierte nicht und die implizite Erstellungsinstruktion wurde ausgeführt, ist aber fehlgeschlagen. Überprüfen Sie Ihren SOL-Saldo und versuchen Sie es erneut.

Nächste Schritte