Swapping
Base-input swap (exact input)
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
// Compute the swap off-chain
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 -> actual input after fees
* swapResult.outputAmount -> tokens received
* swapResult.tradeFee -> fee charged on input mint
*/
const { execute } = await raydium.cpmm.swap({
poolInfo,
poolKeys,
inputAmount,
swapResult,
slippage: 0.001, // 0.1% — range: 1 (100%) to 0.0001 (0.01%)
baseIn,
txVersion: TxVersion.V0,
// optional: set up priority fee here
// 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()Base-output swap (exact output)
Swap parameters
Parameter
Type
Description
CurveCalculator
Method
Description
Parameter
Description
Last updated
Was this helpful?