> For the complete documentation index, see [llms.txt](https://docs.saros.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.saros.xyz/kr/saros-dlmm/technical-guides/swap-tokens.md).

# 토큰 스왑하기

### 개요(Overview)[​](http://10.10.1.89:3000/swap#overview)

이 가이드는 프론트엔드 인터페이스를 통해 Saros DLMM 풀에서 토큰을 교환하는 방법을 설명합니다. 단계는 다음과 같습니다:

1. 스왑 파라미터 정의하기
2. 온체인 `swap` 명령 호출하기

### 스왑 유형 (Swap Types)[​](http://10.10.1.89:3000/swap#swap-types)

스왑에는 두 가지 유형이 있습니다:

1. 정확한 인풋 (Exact Input): 교환할 토큰의 정확한 수량을 지정하면, 그에 상응하는 출력 토큰을 받습니다
2. 정확한 아웃풋 (Exact Output): 받고자 하는 토큰의 정확한 수량을 지정하면, 그에 맞는 입력 토큰을 제공합니다

### 스왑 방향 (Swap Direction)

스왑은 두 가지 방향으로 수행될 수 있습니다:

1. Y로 스왑 (Swap for Y): 토큰 X를 토큰 Y로 교환
2. X로 스왑 (Swap for X): 토큰 Y를 토큰 X로 교환

### 코드 예시 (Example Code)[​](http://10.10.1.89:3000/swap#example-code)

**정확한 입력 스왑 (Exact Input Swap)**

```
import { PublicKey } from "@solana/web3.js";
import { BN } from "@project-serum/anchor";
import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token";

// Define the amount of tokens to swap in
const amountIn = new BN(1000000); // Amount of token X or Y to swap in

// Define the minimum amount of tokens to receive (0 for no minimum)
const otherAmountThreshold = new BN(0);

// Set the swap direction (true for X to Y, false for Y to X)
const swapForY = true;

// Derive bin array PDAs
const [binArrayLowerPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("bin_array"), pairPda.toBuffer(), Buffer.from([0])],
  program.programId
);

const [binArrayUpperPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("bin_array"), pairPda.toBuffer(), Buffer.from([1])],
  program.programId
);

await program.methods
  .swap(amountIn, otherAmountThreshold, swapForY, { exactInput: {} })
  .accounts({
    pair: pairPda,
    binArrayLower: binArrayLowerPda,
    binArrayUpper: binArrayUpperPda,
    tokenMintX: tokenMintX,
    tokenMintY: tokenMintY,
    tokenVaultX: tokenVaultXPda,
    tokenVaultY: tokenVaultYPda,
    userVaultX: userVaultXPda,
    userVaultY: userVaultYPda,
    tokenProgramX: TOKEN_PROGRAM_ID,
    tokenProgramY: TOKEN_PROGRAM_ID,
    user: wallet.publicKey,
  })
  .signers([wallet.payer])
  .rpc();

```

#### 정확한 아웃풋 스왑 (Exact Output Swap)

```
import { PublicKey } from "@solana/web3.js";
import { BN } from "@project-serum/anchor";
import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token";

// Define the amount of tokens to receive
const amountOut = new BN(1000000); // Amount of token to receive

// Define the maximum amount of tokens to provide
const otherAmountThreshold = new BN(2000000); // Maximum amount of token provide

// Set the swap direction (true for X to Y, false for Y to X)
const swapForY = false;

// Derive bin array PDAs
const [binArrayLowerPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("bin_array"), pairPda.toBuffer(), Buffer.from([0])],
  program.programId
);

const [binArrayUpperPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("bin_array"), pairPda.toBuffer(), Buffer.from([1])],
  program.programId
);

await program.methods
  .swap(amountOut, otherAmountThreshold, swapForY, { exactOutput: {} })
  .accounts({
    pair: pairPda,
    binArrayLower: binArrayLowerPda,
    binArrayUpper: binArrayUpperPda,
    tokenMintX: tokenMintX,
    tokenMintY: tokenMintY,
    tokenVaultX: tokenVaultXPda,
    tokenVaultY: tokenVaultYPda,
    userVaultX: userVaultXPda,
    userVaultY: userVaultYPda,
    tokenProgramX: TOKEN_PROGRAM_ID,
    tokenProgramY: TOKEN_PROGRAM_ID,
    user: wallet.publicKey,
  })
  .signers([wallet.payer])
  .rpc();

```

### 스왑 실행 방식 (How the Swap Executes)

스왑을 수행하면 다음이 일어납니다:

1. 사용자의 토큰이 풀의 볼트(vault)로 전송됩니다
2. 스왑이 활성 빈(Active Bin)부터 시작하여 하나 이상의 빈(Bins)에서 실행됩니다
3. 단일 빈에서 스왑을 완료할 수 없는 경우, 활성 빈이 이동하며 스왑이 계속됩니다
4. 풀의 볼트에서 사용자에게 토큰이 전송됩니다
5. 프로토콜 수수료가 징수되어 페어(Pair) 계정에 보관됩니다
