> 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) 계정에 보관됩니다


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.saros.xyz/kr/saros-dlmm/technical-guides/swap-tokens.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
