Swap / intercambio

Ejecuta swaps de tokens en pools CPMM. El SDK admite tanto base-input (cantidad de entrada fija) como base-output (cantidad de salida fija).


Swap base-input (entrada exacta)

Especifica la cantidad exacta de tokens a vender. El SDK calcula cuántos tokens recibes.

import {
  ApiV3PoolInfoStandardItemCpmm,
  CpmmKeys,
  CpmmParsedRpcData,
  CurveCalculator,
  FeeOn,
  TxVersion,
} from '@raydium-io/raydium-sdk-v2'
import { NATIVE_MINT } from '@solana/spl-token'
import BN from 'bn.js'
import { initSdk } from '../config'

const swap = async () => {
  const raydium = await initSdk()

  const poolId = '7JuwJuNU88gurFnyWeiyGKbFmExMWcmRZntn9imEzdny'
  const inputAmount = new BN(100)
  const inputMint = NATIVE_MINT.toBase58()

  let poolInfo: ApiV3PoolInfoStandardItemCpmm
  let poolKeys: CpmmKeys | undefined
  let rpcData: CpmmParsedRpcData

  if (raydium.cluster === 'mainnet') {
    const data = await raydium.api.fetchPoolById({ ids: poolId })
    poolInfo = data[0] as ApiV3PoolInfoStandardItemCpmm
    rpcData = await raydium.cpmm.getRpcPoolInfo(poolInfo.id, true)
  } else {
    const data = await raydium.cpmm.getPoolInfoFromRpc(poolId)
    poolInfo = data.poolInfo
    poolKeys = data.poolKeys
    rpcData = data.rpcData
  }

  if (inputMint !== poolInfo.mintA.address && inputMint !== poolInfo.mintB.address)
    throw new Error('input mint does not match pool')

  const baseIn = inputMint === poolInfo.mintA.address

  // Calcula el swap fuera de la cadena
  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
  )

  /**
   * swapResult.inputAmount   -> entrada real después de comisiones
   * swapResult.outputAmount  -> tokens recibidos
   * swapResult.tradeFee      -> comisión cobrada sobre el input mint
   */

  const { execute } = await raydium.cpmm.swap({
    poolInfo,
    poolKeys,
    inputAmount,
    swapResult,
    slippage: 0.001, // 0.1% — rango: 1 (100%) a 0.0001 (0.01%)
    baseIn,
    txVersion: TxVersion.V0,
    // opcional: configura aquí la prioridad de la comisión
    // computeBudgetConfig: {
    //   units: 600000,
    //   microLamports: 4659150,
    // },
  })

  const { txId } = await execute({ sendAndConfirm: true })
  console.log(`swapped: ${poolInfo.mintA.symbol} to ${poolInfo.mintB.symbol}:`, {
    txId: `https://explorer.solana.com/tx/${txId}`,
  })
}

swap()

Swap base-output (salida exacta)

Especifica la cantidad exacta de tokens a recibir. El SDK calcula cuántos tokens necesitas vender.


Parámetros de Swap

Parámetro
Tipo
Descripción

poolInfo

object

Información del pool desde la API o RPC.

poolKeys

object

Claves del pool. Requeridas para devnet.

inputAmount

BN

Cantidad de tokens de entrada (base-input). Se ignora cuando fixedOut: true.

fixedOut

boolean

Establece true para swaps base-output. Valor predeterminado false.

swapResult

object

Resultado del swap precomputado desde CurveCalculator.swapBaseInput() o CurveCalculator.swapBaseOutput().

slippage

number

Tolerancia de slippage como decimal. 0.001 = 0.1%. Rango: 1 (100%) a 0.0001 (0.01%).

baseIn

boolean

true si se intercambia mintA → mintB, false para mintB → mintA.

txVersion

TxVersion

Versión de la transacción.

CurveCalculator

El CurveCalculator calcula los importes del swap fuera de la cadena antes de enviar la transacción.

Método
Descripción

swapBaseInput()

Dado un importe de entrada exacto, calcula la salida y las comisiones.

swapBaseOutput()

Dado un importe de salida deseado, calcula la entrada requerida.

Ambos métodos usan los mismos parámetros de comisión del configInfo:

Parámetro
Descripción

tradeFeeRate

Comisión cobrada sobre el input del swap, en unidades de 1e-6.

creatorFeeRate

Comisión adicional enviada al creador del pool.

protocolFeeRate

Parte de la comisión de trading enviada al protocolo de Raydium.

fundFeeRate

Parte de la comisión de trading enviada al tesoro de Raydium.

circle-info

Obtén siempre datos RPC actualizados (getRpcPoolInfo) antes de calcular swaps para obtener las reservas más recientes y evitar cotizaciones desactualizadas.

Última actualización

¿Te fue útil?