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

# LaunchLab 본딩 곡선

> LaunchLab이 지원하는 곡선 공식, 폐쇄 형태의 매수 및 매도 비용, 졸업 임계값 도출, 첫 매수부터 졸업까지의 실제 발행 과정 계산 예시.

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

  [영문판 보기 →](/products/launchlab/bonding-curve)
</Info>

<Info>
  LaunchLab은 `Initialize`에서 선택 가능한 세 가지 곡선 형태를 지원합니다: **상수곱** (가장 일반적이며, 표준 `x · y = k` 곡선의 가상 자산 형태), **선형 가격**, **고정 가격**. 졸업 임계값 공식은 세 형태 모두에서 동일합니다. 이 페이지에서는 상수곱 수학을 자세히 설명하고, 선형 및 고정 형태는 마지막에 요약합니다.
</Info>

## `LaunchState`에 저장된 매개변수

| 필드                                                           | 의미                                                                                       |
| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------- |
| `curve_type`                                                 | `0` = 상수곱 (가상 자산), `1` = 고정 가격, `2` = 선형 가격.                                             |
| `base_supply_max`                                            | 곡선이 발행할 수 있는 총 베이스 토큰 개수.                                                                |
| `base_supply_graduation`                                     | 졸업에 도달하기 위해 판매해야 하는 베이스 토큰 개수. 보통 `0.8 × base_supply_max`이며, 남은 20%는 졸업 후 풀의 초기 LP가 됩니다. |
| `quote_reserve_target`                                       | 졸업을 촉발하는 인용 자산 개수. `Initialize`에서 곡선 매개변수 + `base_supply_graduation`으로부터 도출됩니다.          |
| `virtual_base` / `virtual_quote`                             | 상수곱 곡선의 가상 자산 시드값.                                                                       |
| `migrate_type`                                               | 졸업 대상 선택: AMM v4 vs CPMM. [`instructions`](/ko/products/launchlab/instructions)를 참조하세요.  |
| `fees.buy_numerator / buy_denominator`                       | 매수 수수료, 예: `100 / 10_000 = 1.00%`.                                                       |
| `fees.sell_numerator / sell_denominator`                     | 매도 수수료. 보통 매수와 같습니다.                                                                     |
| `fees.protocol_share`, `fees.creator_share`, `fees.lp_share` | 위 수수료의 분배로, 분모를 합산합니다.                                                                   |

Rust 구조체의 필드명은 [`accounts`](/ko/products/launchlab/accounts)에서 설명하는 `PoolState` 필드와 일치합니다. 위의 단위는 개념적입니다.

## 가상 자산을 포함한 상수곱 곡선 (`curve_type = 0`)

기본 및 가장 많이 사용되는 곡선입니다. Pump 스타일의 발행은 모두 이 형태를 사용합니다. 곡선은 처음부터 **가상 인용 자산 보유금** `V_q`와 **가상 베이스 보유금** `V_b`가 있다고 가정하므로 (`PoolState`에 `virtual_quote`와 `virtual_base`로 저장됨), 효과적인 풀은 이러한 보유금을 가진 CPMM처럼 작동합니다. 매수는 `x · y = k` 수학을 따릅니다:

```
(V_q + real_quote_in_after_fee) × (V_b + real_base_remaining − base_out) = V_q × V_b
```

`base_out`에 대해 정렬:

```
base_out = (V_b + real_base_remaining) × quote_in_after_fee / (V_q + real_quote_in_after_fee)
```

베이스 판매량 `s`에서의 유효 가격:

```
price(s) = (V_q + real_quote_in(s)) / (V_b + real_base_remaining(s))
```

LaunchLab이 졸업 전에 적용하는 동일한 `x · y = k` 불변식은 졸업 후 (CPMM 또는 AMM v4) 곡선과 정확히 일치하므로, 졸업 이전은 기계적으로 원활합니다. `base_sold = base_supply_graduation`에서의 한계 가격은 졸업 후 풀이 `(quote_vault, base_vault_remaining)`을 보유금으로 하여 열리는 가격과 같습니다.

## 고정 가격 곡선 (`curve_type = 1`)

평탄한 가격 곡선입니다. 모든 매수/매도는 `Initialize`에서 구성 가능한 상수 가격에서 발생합니다:

```
price(s) = virtual_quote / virtual_base    (모든 s에 대해 상수)
```

팀이 매수 시점과 관계없이 모든 참가자에게 균등한 가격을 원하는 공정한 발행에 유용합니다. `base_supply_graduation`이 판매되면 졸업이 촉발됩니다 (선형 비용 관계는 `quote_reserve_target`을 간단히 도출할 수 있습니다).

## 선형 가격 곡선 (`curve_type = 2`)

가격이 `base_sold`에 따라 선형으로 증가합니다:

```
price(s) = a · s     (a = 기울기, virtual_base / virtual_quote에서 도출됨)
```

통합 비용:

```
cost(s_0, s_1) = a · (s_1² − s_0²) / 2
```

`base_sold`에 대해 이차 함수입니다. 초기 매수자는 거의 0에 가까운 가격을 지불하고, 후기 매수자는 훨씬 더 많은 가격을 지불하며, 한계 가격은 항상 고정된 기울기로 상승합니다. 온체인 구현은 `curve/linear_price.rs`에 있습니다.

## 곡선 형태 비교

```
가격
  │   선형 (가파른 꼬리)                선형 (curve_type = 2)
  │       ╱
  │      ╱
  │     ╱            상수곱 (curve_type = 0)
  │    ╱            ╱
  │   ╱           ╱
  │  ╱         ╱
  │ ╱       ╱
  │╱_____╱_______________________  고정 가격 (curve_type = 1)
  └──────────────────────────────── base_sold
  0                  S_grad         S_max
```

## 졸업 임계값

`quote_reserve_target`은 `Initialize`에서 `base_sold`를 0에서 `base_supply_graduation`으로 변경하는 데 필요한 인용 자산으로 계산됩니다:

```
quote_reserve_target = cost(0, base_supply_graduation) × (1 + buy_fee_rate)
                                                         ^^^^^^^^^^^^^^^^^
                                                         근사값; 정확한
                                                         형태는 Buy에서
                                                         사용하는 수수료
                                                         반올림과 일치합니다.
```

발행은 `quote_vault.balance ≥ quote_reserve_target`이 되는 순간 졸업합니다. 매수가 개별 크기로 발생하므로, 졸업 시 실제 잔액은 목표를 약간 초과할 수 있습니다. 잉여금은 결과 CPMM 풀의 추가 인용 측 유동성이 됩니다.

## 실제 예시 — 이차 발행

매개변수:

* `base_supply_max        = 1_000_000_000` (10억 베이스 토큰, 6 소수자리)
* `base_supply_graduation = 800_000_000`   (80% 판매 시 졸업 촉발)
* `k                      = 40` (가격 스케일)
* 수수료: 매수 1%, 매도 1%, 분배 `lp:creator:protocol = 60:20:20`.

**초기 가격** (`s = 0`): `0` (순수 이차 함수는 0에서 시작).

**50% 판매 시 가격** (`s = 500_000_000`):

```
price = 40 × (500e6 / 1e9)² = 40 × 0.25 = 10  (베이스당 인용 자산, 6 소수자리)
```

**졸업 시 가격** (`s = 800_000_000`):

```
price = 40 × (800e6 / 1e9)² = 40 × 0.64 = 25.6
```

**졸업에 도달하는 데 필요한 인용 자산** (통합 비용):

```
cost(0, 800_000_000) = (40 / (3 × 1e18)) × ((800e6)³ − 0)
                     = (40 / 3e18) × 5.12e26
                     ≈ 6.827e9
```

따라서 약 6.827 인용 자산 원본 단위입니다 (구성된 6 소수자리 인용 민트, 예: 인용이 USDC인 경우 약 6,827 USDC).

**적용된 수수료**:

```
quote_reserve_target ≈ 6.827e9 × 1.01 ≈ 6.895e9  (6,895 USDC)
```

**첫 매수** 10 USDC:

* 가상 상태: `s = 0`, `quote_vault = 0`.
* 수수료 차감: `quote_after_fee = 10 × 0.99 = 9.9`.
* `(40 / (3e18)) × s³ = 9.9` 풀기 ⇒ `s ≈ 6.22e6` 베이스 토큰 매수.
* 1% 수수료 (`0.1 USDC`) 분배: lp `0.06`, creator `0.02`, protocol `0.02`. lp 몫은 `quote_vault`에 남고, 나머지 두 개는 각각의 적립 카운터로 라우팅됩니다.

**75% 판매 시 매수** (졸업 접근):

같은 10 USDC는 이제 곡선이 가파르기 때문에 훨씬 적은 베이스를 매수합니다. `s₀ = 750e6`에서 Newton 풀기, `quote_in_after_fee = 9.9`는 대략 `∆s ≈ 0.4e6`을 제공합니다. 첫 매수 대비 USDC당 베이스가 약 15배 감소합니다.

## 곡선 단계 중 수수료 메커니즘

모든 `Buy`에서:

```
gross_fee      = ceil(quote_in_gross × buy_numerator / buy_denominator)
lp_share       = gross_fee × fees.lp_share / fees.total_share
protocol_share = gross_fee × fees.protocol_share / fees.total_share
creator_share  = gross_fee × fees.creator_share / fees.total_share
```

* `lp_share`는 `quote_vault`에 남습니다. 이는 유효 곡선을 더 타이트하게 만듭니다 (동일한 베이스 공급에 대해 더 많은 인용 자산 보유금).
* `protocol_share`는 `LaunchState.state_data.protocol_fees_quote`를 증가시킵니다.
* `creator_share`는 `LaunchState.state_data.creator_fees_quote`를 증가시킵니다.

`Sell`에서는 동일한 분배가 적용되지만 수수료는 아웃바운드 `quote_out`에서 차감됩니다.

두 카운터는 `CollectFees`를 통해 청소됩니다 (관리자 또는 생성자, 각각 자신의 카운터로).

## 정밀도

* 베이스 측 금액: `u64`.
* 인용 측 금액: `u64`.
* 중간 큐브 / 곱: `u128`.
* "정확한 인용 매수" 및 "정확한 인용 매도"를 위한 Newton 풀기는 구성 가능한 최대 반복 횟수 (기본값 10)로 `u128` 고정소수점으로 반복됩니다. 실패 모드는 `NotConverged`입니다. 졸업 근처 엣지 케이스 외에는 드뭅니다.

## CPMM으로의 이전

`Graduate`가 실행될 때:

```
cpmm_quote_reserve = quote_vault − swept_protocol_fees − swept_creator_fees
cpmm_base_reserve  = base_vault                       // 즉, base_supply_max − base_sold
cpmm_initial_price = cpmm_quote_reserve / cpmm_base_reserve
```

이차 곡선의 경우, `cpmm_initial_price`는 기계적으로 `price(base_sold)`입니다 (이것은 이전 순간의 한계 곡선 가격입니다). CPMM 풀은 정확히 그 가격에서 열리므로, 곡선 UI에서 CPMM UI로 전환하는 관찰자는 점프를 보지 않습니다.

## 다음 단계

* [`products/launchlab/accounts`](/ko/products/launchlab/accounts) — 이러한 매개변수를 저장하는 `LaunchState` 필드.
* [`products/launchlab/instructions`](/ko/products/launchlab/instructions) — `Buy`, `Sell`, `Graduate` 계정 목록.
* [`algorithms/constant-product`](/ko/algorithms/constant-product) — 졸업 후 풀이 사용하는 CPMM 수학.

출처:

* [Raydium SDK v2 `LaunchLab` 모듈](https://github.com/raydium-io/raydium-sdk-V2)
* Raydium LaunchLab 프로그램 소스
