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. Crée un tout nouveau pool CPMM pour deux mints que vous spécifiez, sélectionne le palier de frais de 0,25 %, initialise la liquidité au prix impliqué par les montants initiaux, et affiche le nouvel ID de pool et la signature de la transaction.

Configuration

Assurez-vous d’avoir lu les prérequis du démarrage rapide et d’avoir RPC_URL, KEYPAIR et les dépendances installés. Vous devrez également financer le portefeuille avec les montants initiaux des deux mints, plus suffisamment de SOL pour couvrir les frais uniques de création du pool (~0,15 SOL sur mainnet, consultez reference/program-addresses pour la valeur actuelle).

Le script

Enregistrez sous create-cpmm.mjs :
// create-cpmm.mjs
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import {
  Raydium,
  TxVersion,
  CREATE_CPMM_POOL_PROGRAM,
  CREATE_CPMM_POOL_FEE_ACC,
} 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 MINT_A   = process.env.MINT_A;   // required, base58
const MINT_B   = process.env.MINT_B;   // required, base58
const AMOUNT_A = process.env.AMOUNT_A; // required, integer raw units
const AMOUNT_B = process.env.AMOUNT_B; // required, integer raw units

if (!MINT_A || !MINT_B || !AMOUNT_A || !AMOUNT_B) {
  console.error("Set MINT_A, MINT_B, AMOUNT_A, AMOUNT_B 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",
});

// ── Pick the 0.25% fee tier ─────────────────────────────────────
const feeConfigs = await raydium.api.getCpmmConfigs();
const feeConfig  = feeConfigs.find((c) => c.index === 0);
if (!feeConfig) throw new Error("0.25% fee tier not found in CPMM configs.");

// ── Resolve mint metadata (Token-2022-aware) ────────────────────
const mintA = await raydium.token.getTokenInfo(new PublicKey(MINT_A));
const mintB = await raydium.token.getTokenInfo(new PublicKey(MINT_B));

// ── Build and execute ───────────────────────────────────────────
const { execute, extInfo } = await raydium.cpmm.createPool({
  programId:       CREATE_CPMM_POOL_PROGRAM,
  poolFeeAccount:  CREATE_CPMM_POOL_FEE_ACC,
  mintA,
  mintB,
  mintAAmount:     new BN(AMOUNT_A),
  mintBAmount:     new BN(AMOUNT_B),
  startTime:       new BN(0), // open immediately
  feeConfig,
  associatedOnly:  false,
  ownerInfo:       { useSOLBalance: true },
  txVersion:       TxVersion.V0,
  computeBudgetConfig: {
    units: 600_000,
    microLamports: 100_000,
  },
});

const { txId } = await execute({ sendAndConfirm: true });

console.log(`Pool ID:  ${extInfo.address.poolId.toBase58()}`);
console.log(`LP mint:  ${extInfo.address.lpMint.toBase58()}`);
console.log(`Vault A:  ${extInfo.address.vaultA.toBase58()}`);
console.log(`Vault B:  ${extInfo.address.vaultB.toBase58()}`);
console.log(`Tx:       https://solscan.io/tx/${txId}`);

Exécutez-le

Exemple : créer un pool SOL/USDC avec 1 SOL et 160 USDC d’initialisation :
export MINT_A="So11111111111111111111111111111111111111112"   # wSOL
export MINT_B="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"   # USDC
export AMOUNT_A="1000000000"   # 1 SOL (9 decimals)
export AMOUNT_B="160000000"    # 160 USDC (6 decimals)

node create-cpmm.mjs
Résultat attendu :
Pool ID:  HgC5...3kXb
LP mint:  4ZAS...9rkV
Vault A:  J9Mu...mP2k
Vault B:  AaJq...8wxx
Tx:       https://solscan.io/tx/5dQ...

Ce qui vient de se passer

  1. getCpmmConfigs a récupéré la liste en direct des paliers de frais de api-v3.raydium.io et sélectionné l’index 0 (le palier de 0,25 % — consultez reference/fee-comparison pour la liste complète).
  2. getTokenInfo a résolu les métadonnées de chaque mint, notamment quel programme de jetons en est propriétaire. CPMM accepte les mints SPL Token et Token-2022 ; le SDK les achemine automatiquement.
  3. createPool a construit une transaction unique qui :
    • trie les mints dans l’ordre canonique,
    • dérive le PDA du pool, les vaults, le mint LP et l’autorité,
    • paie les frais uniques create_pool_fee à CREATE_CPMM_POOL_FEE_ACC,
    • crée les ATA de l’appelant s’ils manquent,
    • initialise les vaults avec AMOUNT_A et AMOUNT_B.
  4. Le prix initial est défini par le ratio d’initialisation : prix = AMOUNT_B / AMOUNT_A après ajustement des décimales. Choisissez-le avec soin — les bots arbitreront toute erreur de prix en quelques secondes après l’ouverture du pool.
  5. startTime: new BN(0) ouvre le trading immédiatement. Pour préparer la liquidité avant ouverture au public, définissez un timestamp Unix futur.

Erreurs courantes

  • pool already exists — Un pool existe déjà pour cette paire de mints à ce palier de frais. Vérifiez avant de créer.
  • insufficient funds — Votre portefeuille n’a pas assez de MINT_A, MINT_B ou de SOL (pour les frais de création du pool + loyer).
  • Token-2022 extension not supported — L’un de vos mints utilise une extension que CPMM n’accepte pas. Consultez reference/token-2022-support.

Après le déploiement

Vous pouvez immédiatement échanger contre le nouveau pool — le script Swap from CLI accepte directement votre nouveau POOL_ID. Les agrégateurs (Jupiter, etc.) indexeront le nouveau pool en quelques minutes.

Suivant