> ## 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.

# Swap depuis la CLI

> Script Node prêt à l'emploi qui récupère un devis et exécute un swap CPMM. Configurez quatre variables d'environnement et lancez-le.

<Info>
  **Cette page est traduite automatiquement par IA. La version anglaise fait foi.**

  [Voir la version anglaise →](/quick-start/swap-from-cli)
</Info>

<Info>
  **Ce que cela fait.** Charge un pool CPMM depuis le RPC, récupère un devis de swap avec 0,5 % de slippage, construit la transaction, la signe avec votre paire de clés, et la soumet. De bout en bout en \~30 lignes.
</Info>

## Configuration

Assurez-vous d'avoir lu les [prérequis du démarrage rapide](/fr/quick-start) et que vous disposez de `RPC_URL`, `KEYPAIR`, et des dépendances installées.

## Le script

Enregistrez sous `swap.mjs` :

```ts swap.mjs icon="js" theme={null}
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import { Raydium, TxVersion, CurveCalculator, FeeOn } 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 ────────────────────────────────────────────────────
// getPoolInfoFromRpc takes the base58 string directly, not a PublicKey.
const { poolInfo, poolKeys, rpcData } =
  await raydium.cpmm.getPoolInfoFromRpc(POOL_ID);

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

// ── Quote ────────────────────────────────────────────────────────
const inputAmount = new BN(AMOUNT_RAW);
const swapResult  = CurveCalculator.swapBaseInput(
  inputAmount,
  baseIn ? rpcData.baseReserve : rpcData.quoteReserve,
  baseIn ? rpcData.quoteReserve : rpcData.baseReserve,
  rpcData.configInfo.tradeFeeRate,
  rpcData.configInfo.creatorFeeRate,
  rpcData.configInfo.protocolFeeRate,
  rpcData.configInfo.fundFeeRate,
  rpcData.feeOn === FeeOn.BothToken || rpcData.feeOn === FeeOn.OnlyTokenB,
);

console.log(`Quote: ${inputAmount.toString()} -> ${swapResult.outputAmount.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}`);
```

## Exécutez-le

Choisissez n'importe quel pool CPMM pour lequel vous avez de la liquidité. Exemple avec le pool CPMM SOL/USDC canonique :

```bash icon="terminal" theme={null}
export POOL_ID="<collez un ID de 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 :

```text theme={null}
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 configuration globale, configuré le contexte de votre portefeuille.
2. **`getPoolInfoFromRpc`** a extrait 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 frais.
3. **`CurveCalculator.swap`** a calculé la sortie du produit constant déduction faite des frais du pool. C'est la même mathématique que le programme exécute on-chain, vous pouvez donc comparer les devis hors-chaîne et on-chain.
4. **`raydium.cpmm.swap`** a construit la transaction au format V0 (tables de recherche d'adresses activées) et ajouté une configuration de budget de calcul explicite. Le pourboire du budget de calcul aide la transaction à se valider dans les périodes chargées.
5. **`execute({ sendAndConfirm: true })`** a signé, envoyé et attendu la confirmation.

## Erreurs courantes

* **`Pool not found`** — Mauvais `POOL_ID`, ou vous pointez vers le mauvais cluster (ID de pool mainnet contre un RPC devnet, etc.).
* **`Insufficient funds for transaction`** — Votre portefeuille n'a pas assez de SOL pour l'entrée du swap + frais + loyer ATA.
* **`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 les réserves.
* **`Token account not initialized`** — L'ATA du token de sortie n'existait pas et l'instruction de création implicite s'est exécutée mais a échoué pour une raison quelconque ; vérifiez le solde SOL de votre portefeuille et réessayez.

## Suivant

* [`sdk-api/typescript-sdk`](/fr/sdk-api/typescript-sdk) — référence complète du SDK.
* [`products/cpmm/instructions`](/fr/products/cpmm/instructions) — à quoi ressemble l'instruction de swap on-chain.
* [`integration-guides/priority-fee-tuning`](/fr/integration-guides/priority-fee-tuning) — dimensionner `computeBudgetConfig` pour la production.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.