> ## 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.

# Stable AMM 수학

> 조회 테이블에서 가격을 인용하기 위한 이진 검색과 선형 보간. AMM v4와 동일한 수수료 적용. OpenBook 분리 후 순수 AMM 풀 회계.

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

  [영문판 보기 →](/products/stable/math)
</Info>

## 조회 테이블 곡선

Stable AMM은 x·y=k 공식을 (x, y, price) 튜플의 **희소 조회 테이블**로 대체합니다. 스왑 가격을 책정할 때 프로그램은 다음을 수행합니다:

1. 리저브에서 풀의 현재 비율을 계산합니다.
2. **이진 검색**으로 해당 비율을 포함하는 두 항목을 찾습니다.
3. **선형 보간**으로 중간 가격을 구합니다.
4. 수수료를 적용하고 견적을 반환합니다.

이 접근 방식은 공식의 결정론성을 **관리자의 가격 형성 유연성**으로 바꾸며, Solana의 컴퓨팅 예산에 맞을 정도로 효율적입니다.

## 테이블 레이아웃과 이진 검색

`ModelDataInfo`는 최대 50,000개의 `DataElement` 항목을 보유하며, 관리자가 인덱싱합니다. 처음 `valid_data_count`개만 활성화됩니다. 각 항목:

```
DataElement {
  x: u64,      // X 좌표 (코인 측 금액, 스케일됨)
  y: u64,      // Y 좌표 (PC 측 금액, 스케일됨)
  price: u64,  // price = x/y, 승수로 스케일됨
}
```

현재 풀 리저브(x\_real, y\_real)에서 가격을 찾으려면:

1. 비율을 계산합니다: `target_ratio = (x_real * multiplier) / y_real`.
2. `(element.x * multiplier) / element.y`가 `target_ratio`를 포함하는 항목을 이진 검색합니다.
3. 괄호 `[min_idx, max_idx]`를 찾으면 보간합니다.

프로그램의 이진 검색 코드는 `state.rs::ModelDataInfo::get_mininum_range_by_xy_real`에서 약 150줄을 차지합니다. 핵심 불변식: **항목은 정렬되어야 합니다**(x 오름차순, y 내림차순, price 오름차순).

## 선형 보간

두 테이블 포인트가 비율을 포함하면 보간은 중간 가격과 리저브 쌍을 계산합니다:

```
target = (x_real * multiplier) / y_real

[x1, y1, p1] = table[min_idx]
[x2, y2, p2] = table[max_idx]

// 가격 보간
p = p1 + (p2 - p1) * (target - ratio1) / (ratio2 - ratio1)

// 리저브 보간
x = x1 + (x2 - x1) * (target - ratio1) / (ratio2 - ratio1)
y = y1 + (y2 - y1) * (target - ratio1) / (ratio2 - ratio1)
```

결과는 테이블 포인트를 부드럽게 연결하는 구간별 선형 곡선입니다.

## 스케일링: 승수

풀 리저브와 가격은 다른 스케일로 저장됩니다. `ModelDataInfo`의 `multiplier` 필드가 이를 처리합니다. 일반적인 패턴:

* 코인은 6자리 소수, PC는 18자리 소수입니다.
* 승수 = 10^6 (또는 유사).
* 테이블 항목은 u64 범위에 맞도록 축소된 스케일로 저장됩니다.

프로그램은 읽기/쓰기 시 다음을 통해 재스케일합니다:

```
real_value = table_value * ratio / multiplier
table_value = real_value * multiplier / ratio
```

## 스왑 가격 책정: `SwapBaseIn`과 `SwapBaseOut`

### SwapBaseIn (정확한 입력)

입력 금액 `amount_in`이 주어지면:

1. `(coin_vault, pc_vault)`에서 현재 비율을 가져옵니다.
2. 괄호 테이블 항목을 찾고 보간하여 테이블 공간 비율을 구합니다.
3. 입력을 테이블 공간으로 변환합니다: `dx_table = amount_in * multiplier / ratio`.
4. 새 X 좌표에서 테이블을 쿼리하여 새 Y를 찾습니다.
5. `dy_table = y_old - y_new`.
6. 다시 변환합니다: `dy_real = dy_table * ratio / multiplier`.
7. 거래 수수료를 적용합니다: `dy_output = dy_real - (dy_real * trade_fee_numerator / trade_fee_denominator)`.
8. `dy_output`을 반환합니다.

### SwapBaseOut (정확한 출력)

대칭: 원하는 `amount_out`이 주어지면 필요한 `amount_in`을 풉니다.

두 경로 모두 풀 볼트에서 직접 유효 리저브를 읽습니다. 풀은 수년 동안 OpenBook 미결제 주문을 보유하지 않았으므로 먼저 정산할 것이 없습니다. 볼트 잔액이 전부입니다. ([2026-06-22 업그레이드](/ko/reference/changelog)에서 남은 마켓 코드를 제거했습니다.)

## 수수료 적용

AMM v4와 동일합니다: 전체 유도는 [`products/amm-v4/math`](/ko/products/amm-v4/math)를 참조하세요.

```
gross_fee = amount_in * (swap_fee_numerator / swap_fee_denominator)    // 예: 0.25%
lp_portion = gross_fee - (gross_fee * pnl_numerator / pnl_denominator) // 예: 0.22%
pnl_portion = gross_fee * (pnl_numerator / pnl_denominator)            // 예: 0.03%
```

`pnl_portion`은 `need_take_pnl_*`로 이동하며 관리자가 `WithdrawPnl`을 통해 스윕합니다. `lp_portion`은 볼트에 남아 `k`를 증가시키고 LP 토큰 보유자에게 이익을 줍니다.

## 풀 자산 회계

공식은 역사적으로 풀이 OpenBook OpenOrders 계정에 보유한 자금을 추가했습니다. 풀이 주문 게시를 중단한 이후 실제로는 0이었으며, 2026-06-22 업그레이드에서 공식에서 완전히 제거되어 볼트 전용 계산만 남겼습니다:

```
이전: total assets = vault balances + open-order funds (native_coin_total / native_pc_total) − pending PnL (need_take_pnl)
신규: total assets = vault balances − pending PnL (need_take_pnl)
```

이것은 곡선 수학이 유효 리저브로 취급하는 값입니다(누적되었지만 스윕되지 않은 `need_take_pnl` 부분은 물리적으로 볼트에 있지만 가격 책정에서 제외됩니다). 이전에 OpenOrders 잔액을 읽던 견적 코드와 인덱서는 해당 항목을 제거해야 합니다.

## MonitorStep (제거됨)

`MonitorStep`은 미결제 OpenBook 채우기를 정산하고, `AmmInfo.target_orders`를 재계산하고, 조회 테이블에서 파생된 지정가 주문 그리드를 다시 게시하는 **크랭크 명령어**였습니다. 풀은 수년 전에 OpenBook에 주문 게시를 중단했으므로 크랭크는 할 일이 없었습니다. **2026-06-22 업그레이드에서 제거되었습니다**. 통합자는 Stable 풀을 크랭크할 필요가 없습니다.

## 요약: 이것이 작동하는 이유

조회 테이블 + 보간 설계는 **효율적이고 유연합니다**:

* **효율성:** 이진 검색은 O(log 50,000) ≈ 16회 반복이며, 각각 약 300–500 CU입니다. 보간은 몇 번의 곱셈/나눗셈입니다. 총 견적 비용은 약 5k–15k CU로, 모든 스왑에서 공식을 재계산하는 것보다 훨씬 저렴합니다.
* **유연성:** 관리자는 모든 구간별 선형 곡선을 인코딩할 수 있습니다. 스테이블코인 쌍은 1:1 주변에서 높은 밀도를 얻습니다. 담보 쌍은 사용자 정의 곡선을 얻습니다.
* **자체 포함 유동성:** 모든 자금은 풀 볼트에 있으며 가격 책정은 직접 읽습니다. 크랭크 없음, 외부 오더북 없음, 거래당 더 적은 계정.

보간 로직에 대한 심화 학습은 `raydium-stable/program/src/state.rs`, 메서드 `get_data_by_x`, `get_data_by_y`, `get_dy_by_dx_base_in` 등을 참조하세요.

## 다음 단계

* [계정](/ko/products/stable/accounts) — `ModelDataInfo`와 `DataElement` 필드 참조.
* [명령어](/ko/products/stable/instructions) — 호출 가능한 집합(스왑, 입금, 출금, `WithdrawPnl`)과 제거된 명령어.
* [수수료](/ko/products/stable/fees) — 수수료 적용과 `WithdrawPnl`.
* [`products/amm-v4/math`](/ko/products/amm-v4/math) — OpenBook 수수료 포함 주문 가격 책정 로직.

출처:

* `raydium-stable/program/src/state.rs` (보간 및 이진 검색 구현)
* `raydium-stable/program/src/math.rs` (계산기 유틸리티)
