> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 상수곱 AMM

> x·y=k 불변식, 준비금 기반 가격 책정, 슬리피지 유도, 그리고 Raydium CPMM과 AMM v4에서 사용하는 수수료 처리 방식. 이것은 Raydium의 모든 x·y=k 상품이 참고하는 기준 수학 페이지입니다.

<Info>
  **이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.**

  [영문판 보기 →](/algorithms/constant-product)
</Info>

## 불변식

상수곱 마켓 메이커(CPMM)는 두 개의 준비금 `x`와 `y`를 보유하고 다음을 강제합니다:

```
x · y ≥ k       (모든 거래 이후)
```

여기서 `k`는 거래 전 준비금의 곱입니다. 수수료가 없는 마켓의 경우 `x · y = k`입니다. 수수료가 있으면 `k`는 엄격히 증가합니다(LP 수수료의 일부는 준비금에 유지됩니다).

불변식은 의도적으로 기하학적입니다. 한쪽 준비금이 얼마나 작아지든, 다른 쪽은 무한정 증가하여 균형을 맞춥니다. 즉, 풀을 한쪽도 영에 도달할 때까지 배수할 수 없습니다.

## 가격 책정

### 현물 가격

언제든지 `y`의 한계 가격을 `x`로 표시한 것은 곡선의 접선입니다:

```
p = y / x
```

(유도: `x · y = k`를 음함수 미분하면 `dy/dx = −y/x`를 얻습니다. 부호를 무시하면 `|dy/dx| = y/x`입니다).

이는 무한히 작은 거래에 대해 풀이 제시하는 가격입니다. 유한 거래의 경우, 곡선을 따라 슬리피지로 인해 실현된 가격이 더 악화됩니다.

### 정확한 입력 스왑 (Δx를 지급하고 Δy를 수령)

수수료가 있을 때, `f`를 수수료율이라 하면 (예: `f = 0.0025`는 25 bp):

```
Δx_after_fee = Δx · (1 − f)
Δy           = y · Δx_after_fee / (x + Δx_after_fee)
```

거래 후 준비금:

```
x' = x + Δx
y' = y − Δy
```

전체 `Δx`가 준비금에 들어갑니다. LP 수수료는 `x'`에 유지됩니다. 프로토콜 수수료는 별도의 회계 단계를 통해 곡선에서 제외됩니다([아래 수수료 회계 방식](#fee-accounting-variants) 참조).

### 정확한 출력 스왑 (Δy를 수령하고 최소 Δx를 지급)

```
Δx_after_fee = x · Δy / (y − Δy)
Δx           = Δx_after_fee / (1 − f)
```

`Δx`는 풀이 과소 청구되지 않도록 올림처리됩니다.

## 슬리피지와 가격 영향

**가격 영향**은 거래로 인한 풀의 현물 가격 변화를 측정합니다:

```
p_before = y / x
p_after  = y' / x' = (y − Δy) / (x + Δx)
impact   = (p_before − p_after) / p_before
```

작은 `Δx / x`에 대해, 1차 전개는 다음을 제공합니다:

```
impact ≈ 2 · Δx / x      (수수료 무시)
```

직관: 1% 스왑은 약 2%의 가격 영향을 일으킵니다. 이 2의 계수는 CPMM 풀이 중간 규모 거래에 대해 호가장 시장과 비교하여 "얇아" 보이는 이유입니다. 현재 최고 매수호가에 대해 구매하는 것뿐만 아니라 자신의 한계 가격을 따라갑니다.

**스왑 거래자가 지불하는 유효 가격**:

```
effective = Δx / Δy
```

`p_before`과 `effective` 사이의 스프레드는 **슬리피지**입니다. 온체인 `slippage` UI는 보통 `(effective − p_before) / p_before`로 표현됩니다. SDK의 `computeAmountOut`이 이 이유로 `amountOut`과 `priceImpact`를 모두 반환합니다.

## 코드의 불변식 검증

스왑 후, 프로토콜은 다시 검증합니다:

```
k' = x' · y'  ≥  k  =  x · y
```

위반 사항은 프로그램 버그 또는 산술 오버플로우입니다. Raydium의 스왑 명령어는 사후 조건으로 이 검사를 명시적으로 만듭니다:

```rust theme={null}
let k_before = coin_reserve_before as u128 * pc_reserve_before as u128;
let k_after  = coin_reserve_after  as u128 * pc_reserve_after  as u128;
require!(k_after >= k_before, ErrorCode::InvariantViolation);
```

## 수수료 회계 방식

불변식 검사는 LP 수수료가 준비금에 유지된다고 가정합니다. 다른 Raydium 상품들은 프로토콜/펀드/크리에이터 구성을 다르게 처리합니다:

### CPMM 관례

수수료는 `1_000_000` 분모에서 bp와 유사한 `u64` 비율입니다. 거래 수수료는 `trade_fee_rate`(총합)로 나뉘고 `protocol_fee_rate`, `fund_fee_rate`, `creator_fee_rate`를 통해 세분화됩니다. 각 스왑에서:

```
trade_fee     = ceil(Δx · trade_fee_rate / 1_000_000)
protocol_fee  = trade_fee · protocol_fee_rate / 1_000_000
fund_fee      = trade_fee · fund_fee_rate     / 1_000_000
creator_fee   = trade_fee · creator_fee_rate  / 1_000_000
lp_fee        = trade_fee − protocol_fee − fund_fee − creator_fee
```

3개의 non-LP 공유는 별도 카운터(`protocol_fees_*`, `fund_fees_*`, `creator_fees_*`)에 적립되며 불변식에 사용되는 준비금에서 **제외**됩니다. 이것이 곡선을 이동하지 않고 수수료를 스윕할 수 있는 방법입니다. [`products/cpmm/fees`](/ko/products/cpmm/fees)를 참조하세요.

### AMM v4 관례

수수료는 `10_000` 분모의 `numerator / denominator` 비율입니다. 분할은 풀 생성 시 고정되고 `AmmInfo.fees`에 저장됩니다:

```
swap_fee  = ceil(Δx · swap_fee_numerator / swap_fee_denominator)    // 예: 0.25%
pnl_share = swap_fee · pnl_numerator / swap_fee_numerator            // 예: 0.03 / 0.25 = 12%
lp_share  = swap_fee − pnl_share                                     // 거래량의 0.22%
```

`pnl_share`는 `state_data.need_take_pnl_*`에 적립되고 준비금에서 제외됩니다. `lp_share`는 보관소에 유지됩니다. [`products/amm-v4/fees`](/ko/products/amm-v4/fees)를 참조하세요.

두 관례 모두 불변식을 같은 방식으로 유지합니다. 차이점은 미학적입니다(분모 + 부분 범주 수).

## 반올림 규칙

* **수수료 계산은 올림합니다.** 풀이 수수료를 절대 과소 청구하지 않도록 합니다.
* **출력 금액은 내림합니다.** 불변식이 엄격하게 유지되도록 합니다(`k' > k`, 수수료 추가 전에도).
* **정확한 출력 입력 금액은 올림합니다.** 사용자가 과소 지불하지 않도록 합니다.

모든 산술은 큰 준비금에서 오버플로우를 피하기 위해 `x · Δx` 곱에 `u128`을 사용합니다. 최종 결과는 포화 검사를 통해 `u64`로 다시 캐스트됩니다.

## 엣지 케이스

### 빈 풀

첫 `Deposit` 전에, `x = y = 0`입니다. 스왑 명령어는 예금 전을 거부합니다.

### 영 출력

`Δx`가 충분히 작아서 내림 `Δy`가 0이 되면, 명령어는 `ZeroTradingTokens`으로 복귀합니다. 이것은 지불 없이 가치를 추출하는 것을 방지합니다. 또한 매우 불균형한 풀의 먼지 스왑이 실패함을 의미합니다.

### 먼지 LP

첫 `Deposit`은 특별한 처리를 받습니다. 초기 LP 공급을 `sqrt(x · y)`로 계산하고 "초기 번 (init burn)" 금액(보통 100 LP 단위)을 번합니다. 이것은 "첫 예금자 인플레이션 공격"을 방지합니다(공격자가 보관소에 기부하고 LP 토큰 가치를 인플레이션하는 경우). 후속 예금은 비례 수학을 사용합니다.

## 차익거래와의 관계

CPMM 풀의 가격은 다음을 통해서만 변경됩니다:

1. 풀 자체를 통한 거래(사용자가 곡선을 따라 이동).
2. 기부(스왑 없이 보관소로 토큰 전송).

거래가 곡선으로 결정론적으로 가격을 움직이기 때문에, 가격이 더 광범위한 시장과 다르게 벗어나는 풀은 차익거래 기회를 만듭니다. 차익거래자는 풀 가격을 기대하는 시장 가격 쪽으로 돌립니다. 이것이 CPMM 풀이 "오라클 없이 가격을 제시한다"고 불리는 이유입니다. 시장은 풀이 외부에서 읽는 대신 차익거래를 통해 가격을 찾습니다.

반대면: 풀 자체는 차익거래자의 거래상대방입니다. 따라서 모든 차익거래 이익은 LP 영구 손실입니다(LP가 캡처한 수수료 제외).

## 작업 예시

### 예시 1 — 작은 거래, 무시할 수 있는 슬리피지

풀: `x = 1_000_000, y = 2_000_000, k = 2·10^12`. 수수료 `f = 0.0025`.

거래 `Δx = 1_000`:

```
Δx_after_fee = 1000 · 0.9975  = 997.5
Δy           = 2_000_000 · 997.5 / (1_000_000 + 997.5)
             = 1_995_000_000 / 1_000_997.5
             ≈ 1_993.01
```

유효 가격: `1000 / 1993.01 ≈ 0.5018`. 이전 현물: `0.5`. 영향: \~0.36%.

### 예시 2 — 중간 규모 거래, 가시적 슬리피지

동일 풀, `Δx = 100_000` (`x`의 10%):

```
Δx_after_fee = 100_000 · 0.9975 = 99_750
Δy           = 2_000_000 · 99_750 / (1_000_000 + 99_750)
             = 199_500_000_000 / 1_099_750
             ≈ 181_405
```

유효: `100_000 / 181_405 ≈ 0.5513`. 영향: \~10.3% — `2 · 10% = 20%` 경험칙의 약 절반입니다(경험칙은 수수료가 없는 상수곱 곡선의 최악의 경우 상한입니다. 거래 수수료와 공식의 반전이 이를 낮춥니다).

## 포인터

* [`products/cpmm/math`](/ko/products/cpmm/math) — CPMM의 특정 반올림 + 수수료 분모 선택.
* [`products/amm-v4/math`](/ko/products/amm-v4/math) — AMM v4의 OpenBook 통합 준비금이 이 모델을 어떻게 확장하는지.
* [`algorithms/slippage-and-price-impact`](/ko/algorithms/slippage-and-price-impact) — UI를 위한 슬리피지 허용 크기 조정 전용 페이지.

출처:

* Uniswap v2 백서 — `x · y = k`의 표준 설명.
* Raydium CPMM 프로그램 소스.
* Raydium AMM v4 프로그램 소스.
