raydium-io / raydium-sdk-V2-demo

Open-source Typescript SDK demos
48 stars 31 forks source link

cpmm swap mintA -> mintB #12

Closed violet-evergarden closed 4 months ago

violet-evergarden commented 4 months ago

my question is how to reverse cpmm swap mintB -> mintA

cpmm swap mintA -> mintB

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

  // SOL - USDC pool
  const data = await raydium.api.fetchPoolById({ ids: '7JuwJuNU88gurFnyWeiyGKbFmExMWcmRZntn9imEzdny' })
  const poolInfo = data[0] as ApiV3PoolInfoStandardItemCpmm
  const rpcData = await raydium.cpmm.getRpcPoolInfo(poolInfo.id, true)

  const inputAmount = new BN(10000)

  // swap pool mintA for mintB
  const swapResult = CurveCalculator.swap(
    inputAmount,
    rpcData.baseReserve,
    rpcData.quoteReserve,
    rpcData.configInfo!.tradeFeeRate
  )

  /**
   * swapResult.sourceAmountSwapped -> input amount
   * swapResult.destinationAmountSwapped -> output amount
   * swapResult.tradeFee -> this swap fee, charge input mint
   */

  const { execute } = await raydium.cpmm.swap({
    poolInfo,
    swapResult,
    baseIn: true,
  })

  const { txId } = await execute()
  console.log(`swapped: ${poolInfo.mintA.symbol} to ${poolInfo.mintB.symbol}:`, { txId })
}
violet-evergarden commented 4 months ago

This example is to exchange mintA for mintB. Is there any example of mintB swap mintA?

cruzshia commented 4 months ago

just modify 2 parts of code, added comments below.

const swapResult = CurveCalculator.swap(
    inputAmount,
    rpcData.baseReserve, // swap mintB -> mintA, pass rpcData.quoteReserve
    rpcData.quoteReserve, // swap mintB -> mintA, pass rpcData.baseReserve
    rpcData.configInfo!.tradeFeeRate
  )
  const { execute } = await raydium.cpmm.swap({
    poolInfo,
    swapResult,
    baseIn: true, // swap mintB -> mintA, pass false
  })
violet-evergarden commented 4 months ago

Perfect

violet-evergarden commented 4 months ago

How to initiate a transaction using baseInput?

other people's transaction baseInput my transaction baseOutput

cruzshia commented 4 months ago

if you swapped mintA for mintB it uses SwapBaseInput, if swap mintB for mintA it uses SwapBaseOutput, it's decided your tx is baseIn or baseOut. so you can't use SwapBaseInput when you want to swap mintB to mint A

violet-evergarden commented 4 months ago

According to this explanation, in the same pool "7JuwJuNU88gurFnyWeiyGKbFmExMWcmRZntn9imEzdny" can mintA and mintB be exchanged? As shown below

image image
cruzshia commented 4 months ago

No.

violet-evergarden commented 4 months ago

How does this Instruction use usdc as mintA?

image
cruzshia commented 4 months ago

That's solscan's display error, you can find out in other explorers swapBaseInput input mint always to be sol. And I think this problem doesn't need to discuss more. https://explorer.solana.com/tx/qFVrBsLvAgWBqULaHskfbgyXXpiFxjTkwWM9dgsc8s7sMNNNSqFwYK4XcyK1H91po1Tbnmj92uam96SSifdu9cX

https://explorer.solana.com/tx/qFVrBsLvAgWBqULaHskfbgyXXpiFxjTkwWM9dgsc8s7sMNNNSqFwYK4XcyK1H91po1Tbnmj92uam96SSifdu9cX