Saltar al contenido 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.

Esta página fue traducida automáticamente por IA. La versión en inglés es la fuente autorizada.Ver versión en inglés →
Qué hace esto. Carga un pool CPMM desde RPC, obtiene una cotización de swap con 0.5% de slippage, construye la transacción, la firma con tu keypair y la envía. De principio a fin en ~30 líneas.

Configuración

Asegúrate de que has leído los requisitos previos del inicio rápido y que tienes RPC_URL, KEYPAIR y las dependencias instaladas.

El script

Guarda como 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}`);

Ejecútalo

Elige cualquier pool CPMM en el que tengas liquidez. Ejemplo con el pool CPMM SOL/USDC canónico:
export POOL_ID="<pega un ID de pool CPMM — encuentra uno en la pestaña Pools de la interfaz de Raydium>"
export INPUT_MINT="So11111111111111111111111111111111111111112"
export AMOUNT_RAW="10000000"   # 0.01 SOL

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

Qué acaba de suceder

  1. Raydium.load inicializó el SDK — descargó la configuración global y configuró el contexto de tu wallet.
  2. getPoolInfoFromRpc obtuvo el estado actual del pool directamente desde RPC (no desde la caché de API). Para swaps de alto valor siempre quieres estado fresco.
  3. CurveCalculator.swap calculó el resultado del producto constante neto de la tarifa del pool. Esta es la misma matemática que ejecuta el programa on-chain, por lo que puedes comparar cotizaciones off-chain y on-chain.
  4. raydium.cpmm.swap construyó la transacción con formato V0 (tablas de búsqueda de direcciones habilitadas) y añadió una configuración de presupuesto de cómputo explícita. La propina de presupuesto de cómputo ayuda a que la transacción se complete en momentos de mucho tráfico.
  5. execute({ sendAndConfirm: true }) firmó, envió y esperó confirmación.

Errores comunes

  • Pool not foundPOOL_ID incorrecto, o estás conectado al clúster equivocado (ID de pool mainnet contra RPC de devnet, etc.).
  • Insufficient funds for transaction — Tu wallet no tiene suficiente SOL para el input del swap + comisiones + renta de ATA.
  • Slippage tolerance exceeded — El precio del pool cambió entre la cotización y la ejecución. Re-ejecuta; o aumenta el parámetro slippage; o usa el método computeAmountOut del SDK que siempre vuelve a obtener las reservas.
  • Token account not initialized — El ATA del token de salida no existía y la instrucción de creación implícita se completó pero falló por alguna razón; verifica el saldo de SOL de tu wallet e intenta nuevamente.

Siguiente