Passer au contenu principal

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.

Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Ce que cela fait. Charge un pool CPMM depuis le RPC, donne un devis de swap avec 0,5 % de slippage, construit la transaction, la signe avec votre keypair et l’envoie. Le tout en ~30 lignes.

Configuration

Assurez-vous d’avoir lu les prérequis du Démarrage rapide et d’avoir RPC_URL, KEYPAIR, et les dépendances installées.

Le script

Enregistrez en tant que 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}`);

Lancer le script

Choisissez n’importe quel pool CPMM pour lequel vous avez de la liquidité. Exemple avec le pool CPMM canonique SOL/USDC :
export POOL_ID="<collez l'ID d'un pool CPMM — trouvez-en un dans l'onglet Pools de l'interface Raydium>"
export INPUT_MINT="So11111111111111111111111111111111111111112"
export AMOUNT_RAW="10000000"   # 0.01 SOL

node swap.mjs
Résultat attendu :
Quote: 10000000 -> 1640000
Fee:   25000
Swap landed: https://solscan.io/tx/4Z9...

Ce qui vient de se passer

  1. Raydium.load a initialisé le SDK — récupéré la config globale, configuré le contexte de votre portefeuille.
  2. getPoolInfoFromRpc a tiré l’état du pool en direct depuis le RPC (pas du cache de l’API). Pour les swaps de grande valeur, vous voulez toujours un état à jour.
  3. CurveCalculator.swap a calculé la sortie produit constant nets des frais du pool. C’est la même math que le programme exécute en chaîne, donc vous pouvez comparer les devis hors chaîne et sur chaîne.
  4. raydium.cpmm.swap a construit la transaction au format V0 (tables de recherche d’adresses activées) et ajouté une config de budget de calcul explicite. Le pourboire du budget de calcul aide la tx à se poser dans les fenêtres chargées.
  5. execute({ sendAndConfirm: true }) a signé, envoyé et attendu la confirmation.

Erreurs courantes

  • Pool not found — Mauvais POOL_ID, ou vous pointez sur le mauvais cluster (ID de pool mainnet par rapport à un RPC devnet, etc.).
  • Insufficient funds for transaction — Votre portefeuille n’a pas assez de SOL pour le montant du swap + frais + ATA loyer.
  • Slippage tolerance exceeded — Le prix du pool a changé entre le devis et l’exécution. Relancez ; ou augmentez le paramètre slippage ; ou utilisez computeAmountOut du SDK qui récupère toujours à nouveau les réserves.
  • Token account not initialized — L’ATA du jeton de sortie n’existait pas et l’instruction de création implicite s’est posée mais a échoué pour une raison quelconque ; vérifiez le solde SOL de votre portefeuille et réessayez.

Ensuite