スワップ

CPMMプールでトークンスワップを実行します。SDKは両方をサポートしています base-input (固定入力額)と base-output (固定出力額)のスワップです。


Base-input スワップ(正確な入力)

売却するトークンの正確な数量を指定します。SDKが受け取るトークン数を計算します。

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

  // スワップをオフチェーンで計算
  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   -> 手数料差引後の実際の入力額
   * swapResult.outputAmount  -> 受け取るトークン
   * swapResult.tradeFee      -> input mint に対して課される手数料
   */

  const { execute } = await raydium.cpmm.swap({
    poolInfo,
    poolKeys,
    inputAmount,
    swapResult,
    slippage: 0.001, // 0.1% — 範囲: 1 (100%) 〜 0.0001 (0.01%)
    baseIn,
    txVersion: TxVersion.V0,
    // optional: ここで priority fee を設定
    // 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 スワップ(正確な出力)

受け取るトークンの正確な数量を指定します。SDKが売却に必要なトークン数を計算します。


Swap パラメータ

Parameter
Type
Description

poolInfo

object

API または RPC から取得したプール情報。

poolKeys

object

プールキー。devnet では必須です。

inputAmount

BN

入力トークンの量(base-input)。 fixedOut: true.

fixedOut

boolean

に設定 true base-output スワップ用。デフォルトは false.

swapResult

object

事前計算された swap 結果。 CurveCalculator.swapBaseInput() または CurveCalculator.swapBaseOutput().

slippage

number

小数として表した Slippage 許容値。 0.001 = 0.1%。範囲: 1 (100%)から 0.0001 (0.01%).

baseIn

boolean

true mintA → mintB をスワップする場合は false mintB → mintA の場合は。

txVersion

TxVersion

トランザクションのバージョン。

CurveCalculator

The CurveCalculator トランザクション送信前に、オフチェーンで swap 量を計算します。

Method
Description

swapBaseInput()

正確な入力額が与えられると、出力額と手数料を計算します。

swapBaseOutput()

希望する出力額が与えられると、必要な入力額を計算します。

両方のメソッドは、プールの同じ手数料パラメータを使用します configInfo:

Parameter
Description

tradeFeeRate

swap input から 1e-6 単位で差し引かれる手数料。

creatorFeeRate

プール作成者に送られる追加手数料。

protocolFeeRate

Raydium protocol に送られる取引手数料の割合。

fundFeeRate

Raydium treasury に送られる取引手数料の割合。

circle-info

常に新しい RPC データを取得して(getRpcPoolInfo)から swap を計算し、最新のリザーブを取得して古い見積りを避けてください。

最終更新

役に立ちましたか?