> ## 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 명령어

> Initialize, Buy, Sell, Graduate, CollectFees, SetParams — 모든 LaunchLab 명령어의 인수 형태, 계정 목록, 사전/사후 조건.

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

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

<Info>
  LaunchLab은 간결한 명령어 집합을 제공합니다: 사용자 대면 6개 호출과 소수의 관리 기본 명령어들입니다. SDK가 모두 래핑하고 있으며, 이 페이지는 애그리게이터, 모니터링 도구, CPI가 필요한 프로그램을 위한 원본 인터페이스를 문서화합니다.
</Info>

## 명령어 목록

| 그룹        | 명령어                                                        | 호출 가능                                                                                                                           |
| --------- | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| 글로벌 설정    | `CreateConfig` / `UpdateConfig`                            | 관리자                                                                                                                             |
| 출시 라이프사이클 | `Initialize` / `InitializeV2`                              | 누구나 (생성자) — SPL Token 출시; V2는 향후 CPMM 졸업을 위해 `amm_creator_fee_on` 기록                                                            |
| 출시 라이프사이클 | `InitializeWithToken2022`                                  | 누구나 (생성자) — Token-2022 출시, 선택적 `TransferFeeConfig`                                                                              |
| 거래        | `BuyExactIn` / `BuyExactOut`                               | 누구나 — 본딩 곡선에서 정액 입력 / 정액 출력 매수                                                                                                  |
| 거래        | `SellExactIn` / `SellExactOut`                             | 누구나 — 본딩 곡선에서 정액 입력 / 정액 출력 매도                                                                                                  |
| 졸업        | `MigrateToAmm`                                             | 마이그레이션 지갑 (`GlobalConfig`에 설정) — AMM v4로 졸업. `amm_creator_fee_on = BothToken`일 때 사용되므로 생성자 수수료를 양쪽에서 수집할 수 있습니다.                |
| 졸업        | `MigrateToCpswap`                                          | 마이그레이션 지갑 — CPMM으로 졸업. `amm_creator_fee_on = QuoteToken`일 때 사용되며 Token-2022 출시에 필수입니다. CPMM의 `InitializeWithPermission`을 래핑합니다. |
| 수수료       | `CollectFee`                                               | 관리자 — 출시에서 프로토콜 수수료 수집                                                                                                          |
| 수수료       | `CollectMigrateFee`                                        | 관리자 — 누적된 마이그레이션 수수료 수집                                                                                                         |
| 수수료       | `ClaimCreatorFee`                                          | 생성자 — 곡선 단계에서 누적된 생성자 수수료 청구                                                                                                    |
| 베스팅       | `CreateVestingAccount`                                     | 생성자 — 잠금 토큰을 수혜자에게 할당, 졸업 후 잠금 해제                                                                                               |
| 베스팅       | `CreatePlatformVestingAccount`                             | 플랫폼 관리자 — 플랫폼 측 수혜자에게 잠금 토큰 할당                                                                                                  |
| 베스팅       | `ClaimVestedToken`                                         | 수혜자 — 클리프 후 잠금 해제 토큰 청구                                                                                                         |
| 플랫폼 설정    | `CreatePlatformConfig` / `UpdatePlatformConfig`            | 플랫폼 관리자                                                                                                                         |
| 플랫폼 설정    | `UpdatePlatformCurveParam` / `RemovePlatformCurveParam`    | 플랫폼 관리자 — 허용된 곡선 형태의 플랫폼별 목록 관리                                                                                                 |
| 플랫폼 수수료   | `ClaimPlatformFee` / `ClaimPlatformFeeFromVault`           | 플랫폼 관리자                                                                                                                         |
| 플랫폼 접근    | `CreatePlatformGlobalAccess` / `ClosePlatformGlobalAccess` | 관리자 — 주어진 `GlobalConfig`를 사용할 수 있는 플랫폼 제어                                                                                       |

"ExactIn/ExactOut" 분할은 CPMM의 `SwapBaseInput` / `SwapBaseOutput`을 반영합니다 — 온체인에서는 약간 다른 반올림을 가진 별도 명령어 판별자입니다.

**졸업 경로 선택.** `migrate_type`은 `Initialize{V2,WithToken2022}` 시점에 `PoolState`에 기록되며 실행 가능한 두 졸업 명령어 중 하나를 결정합니다. Token-2022 출시는 항상 CPMM으로 마이그레이션합니다. SPL Token 출시는 `amm_creator_fee_on` 설정에 따라 AMM v4 또는 CPMM으로 마이그레이션합니다:

* `BothToken` → `MigrateToAmm` → AMM v4 풀 (생성자 수수료를 양쪽에서 수집할 수 있음; AMM v4는 네이티브 생성자 수수료 필드가 없으므로 생성자 수수료는 LP 잠금 NFT 메커니즘으로 대신 취함).
* `QuoteToken` → `MigrateToCpswap` → `creator_fee_on = OnlyQuoteToken`을 가진 CPMM 풀 (생성자는 LaunchLab 수수료 키 NFT를 통해 CPMM 풀에서 계속 수수료를 얻습니다 — [`products/launchlab/creator-fees`](/ko/products/launchlab/creator-fees) 참조).

<Tip>
  **`AmmCreatorFeeOn` 열거형 이름 참고.** Rust 소스는 이 열거형을 `AmmCreatorFeeOn`이라 호칭하며 변종은 `QuoteToken`과 `BothToken`입니다. 이름이 오해의 소지가 있습니다: 현재 운영 실무에서 변종은 졸업 후 CPMM 풀에서 생성자 수수료가 수집되는 쪽을 제어할 뿐만 아니라 졸업 **대상 프로그램** (AMM v4 vs CPMM)도 선택하며 출시의 `PoolState`의 `migrate_type`과 쌍을 이룹니다. 이 필드를 "마이그레이션 대상 + 졸업 후 생성자 수수료 쪽"으로 하나로 묶인 것으로 생각하세요. 온체인 열거형 이름은 리팩터링되지 않았지만, `MigrationTarget`으로 추론하는 것이 현실과 더 일치합니다.
</Tip>

## `Initialize`

새 출시를 생성합니다.

**인수**

```
launch_params: {
    curve_type:                 u8,
    base_supply_max:            u64,
    base_supply_graduation:     u64,
    k:                          u128,              // 또는 curve_type=1에 대한 initial_virtual_quote_reserve
    open_time:                  u64,
    quote_mint:                 Pubkey,
    base_token_metadata: {                         // 인라인 name/symbol/uri; 프로그램이 Metaplex로 CPI
        name:   String,
        symbol: String,
        uri:    String,
    },
    fees: {
        buy_numerator:   u64,
        buy_denominator: u64,
        sell_numerator:  u64,
        sell_denominator: u64,
        lp_share:        u64,
        creator_share:   u64,
        protocol_share:  u64,
        total_share:     u64,
    },
    post_graduation_lp_policy:  u8,                // 0 = Burn, 1 = Lock, 2 = ToCreator
}
```

**계정** (축약)

| #  | 이름                 | W | S | 참고                                        |
| -- | ------------------ | - | - | ----------------------------------------- |
| 1  | `creator`          | W | S | 렌트 + 베이스 민트 생성 비용 지불.                     |
| 2  | `launch_config`    |   |   | 프로토콜 설정 바인딩.                              |
| 3  | `launch_state`     | W |   | 새 계정.                                     |
| 4  | `launch_authority` |   |   | PDA.                                      |
| 5  | `base_mint`        | W | S | 신규 Keypair (또는 PDA) — 이 명령어가 초기화합니다.      |
| 6  | `base_vault`       | W |   | `launch_authority`의 `base_mint`에 대한 ATA.  |
| 7  | `quote_mint`       |   |   |                                           |
| 8  | `quote_vault`      | W |   | `launch_authority`의 `quote_mint`에 대한 ATA. |
| 9  | `metadata`         | W |   | Metaplex 메타데이터 PDA.                       |
| 10 | `metaplex_program` |   |   |                                           |
| 11 | `token_program`    |   |   | SPL Token만.                               |
| 12 | `system_program`   |   |   |                                           |
| 13 | `rent`             |   |   |                                           |

**사전 조건**

* `quote_mint ∈ launch_config.allowed_quote_mints`.
* `base_supply_graduation ≤ base_supply_max`.
* 수수료 파라미터가 `launch_config.max_*_fee_rate` 검사를 통과합니다.
* `open_time ≥ now − slop` (SDK는 `≥ now`를 강제; 프로그램은 약간의 과거 날짜를 허용).
* `curve_type`이 인식됩니다.

**사후 조건**

* `base_mint`는 `supply = base_supply_max`, 모두 `base_vault`에 있습니다.
* `base_mint.mint_authority = launch_authority`, `freeze_authority = None`.
* `LaunchState`는 `status = Active`, `base_sold = 0`, `quote_reserve_real = 0`으로 초기화됩니다.
* `quote_reserve_target`은 곡선 파라미터 + `base_supply_graduation` + `buy_numerator`에서 계산됩니다 (대략적으로).

**일반적 오류** — `InvalidQuoteMint`, `FeeRateTooHigh`, `InvalidCurveParams`, `MathOverflow`.

## `Buy` (표준 변형: `BuyExactIn`)

사용자가 고정 `quote_in`을 제공하고 곡선이 `base_out`을 계산합니다.

**인수**

```
quote_in:          u64
minimum_base_out:  u64
```

**계정**

| #  | 이름                         | W | S |
| -- | -------------------------- | - | - |
| 1  | `user`                     | W | S |
| 2  | `launch_state`             | W |   |
| 3  | `launch_authority`         |   |   |
| 4  | `base_vault`               | W |   |
| 5  | `quote_vault`              | W |   |
| 6  | `user_base_ata`            | W |   |
| 7  | `user_quote_ata`           | W |   |
| 8  | `base_mint`                |   |   |
| 9  | `quote_mint`               |   |   |
| 10 | `token_program`            |   |   |
| 11 | `associated_token_program` |   |   |
| 12 | `system_program`           |   |   |

**사전 조건**

* `launch_state.status == Active`.
* `now ≥ open_time`.
* `user_quote_ata.balance ≥ quote_in`.
* `quote_in > 0`.

**효과**

1. `quote_in`을 `quote_in_after_fee`와 수수료 부분으로 분할합니다.
2. 포스트 수수료 견적에 주어진 `base_out`에 대해 곡선을 Newton 풀이합니다.
3. `require(base_out ≥ minimum_base_out)` 아니면 `ExceededSlippage`로 되돌립니다.
4. `quote_in`을 사용자 → 볼트로 이동합니다. `base_out`을 볼트 → 사용자로 이동합니다.
5. `base_sold += base_out`, `quote_reserve_real += quote_in_after_fee × (lp_share / total_share)`을 업데이트합니다.
6. 수수료 카운터 (`protocol_fees_quote`, `creator_fees_quote`)를 업데이트합니다.
7. `state_data.num_buys += 1`.
8. 업데이트 후 `quote_reserve_real ≥ quote_reserve_target`이면, SDK는 일반적으로 같은 거래에서 `Graduate` ix를 연결합니다. 프로그램은 `Buy` 내에서 자동 졸업하지 않습니다 — 후속 `Graduate`이 필요합니다.

## `BuyExactOut`

사용자가 정확한 `base_out`을 지정하고 프로그램이 `quote_in`을 계산합니다.

**인수**

```
base_out:      u64
maximum_quote_in: u64
```

`BuyExactIn`과 동일한 계정. Newton 반복 대신 폐쇄형 이차 적분 (또는 curve\_type 1에 대한 CPMM 역함수)을 사용합니다.

## `Sell` / `SellExactIn` / `SellExactOut`

`Buy`의 미러. 사용자가 `base_in`을 곡선에 반환하고 `quote_out`을 받습니다. 수수료는 `quote_out`에서 차감되므로 사용자는 원본 통합 수익보다 적게 받습니다.

**사전 조건** —

* `user_base_ata.balance ≥ base_in`.
* 매도는 `base_sold`를 0 이하로 밀어낼 수 없습니다 (위의 것과 중복이며 회계가 일관성이 있음).
* 출시는 `Active`입니다.

**효과** — `Buy`와 대칭입니다. `base_sold`는 감소하고, `quote_reserve_real`은 감소합니다. 수수료는 여전히 누적됩니다.

## `MigrateToAmm` / `MigrateToCpswap`

곡선이 `total_quote_fund_raising`에 도달하면 출시를 거래 가능한 AMM 풀로 졸업합니다. 두 명령어는 두 졸업 대상 — AMM v4 및 CPMM —에 해당하며 **임의의 주어진 출시에 대해 하나만 유효하며**, `pool_state.migrate_type`에 의해 결정됩니다 (`Initialize` 시점에 설정).

**서명자**

* `MigrateToAmm` — 바인딩 `GlobalConfig`에 기록된 `migrate_to_amm_wallet`.
* `MigrateToCpswap` — 바인딩 `GlobalConfig`에 기록된 `migrate_to_cpswap_wallet`.

이들 지갑은 일반적으로 Raydium 운영 졸업 크랭크에 의해 보유됩니다; 실무에서 졸업은 임계값이 통과된 후 몇 초 안에 나타나며, 최종 매수를 트리거한 사람과 무관합니다.

**인수**

`MigrateToAmm`은 3개를 취합니다 (주로 프로그램이 AMM v4로 전달하는 OpenBook 마켓 파라미터):

```
base_lot_size:               u64
quote_lot_size:              u64
market_vault_signer_nonce:   u8
```

`MigrateToCpswap`은 없습니다.

**효과 (둘 다에 공통)**

1. `pool_state.status == Migrate` 확인 (즉, `quote_reserve_target`에 도달함). 아니면 `PoolMigrated` (상태는 이미 `Migrated`) 또는 `PoolFunding` (여전히 자금 조성 중)으로 되돌립니다.
2. `pool_state.migrate_type`이 명령어와 일치하는지 확인 (`0` AMM, `1` CPMM). 아니면 `MigrateTypeNotMatch`로 되돌립니다.
3. 졸업 후 예비금을 계산합니다:
   * `base_amount_out = base_vault.amount − vesting_schedule.total_locked_amount`
   * `quote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee`
4. 대상 프로그램 (`AMM v4 Initialize2` 또는 `CPMM InitializeWithPermission`)으로 CPI하고 졸업 후 풀을 생성합니다.
5. 결과 LP를 바인딩 `PlatformConfig.{platform_scale, creator_scale, burn_scale}` (CPMM만)에 따라 분할합니다 — 한 조각은 `platform_nft_wallet`로 발행되고, 하나는 LP 잠금 프로그램으로 래핑된 생성자 NFT로, 하나는 Burn & Earn으로 소각됩니다. AMM v4 졸업의 경우, LP 배치는 AMM v4의 자체 초기화 파라미터에 의해 관리됩니다.
6. `base_mint.mint_authority` 취소 (`None`으로 설정).
7. `pool_state.status = Migrated`로 전환, `vesting_schedule.start_time = block_time + cliff_period` 설정.

**사후 조건** — `BuyExactIn`, `BuyExactOut`, `SellExactIn`, `SellExactOut`은 이 시점부터 `PoolMigrated`로 거부합니다. 결과 AMM 풀은 표준이며 다른 AMM v4 / CPMM 풀처럼 거래됩니다.

**일반적 오류** — `PoolFunding`, `PoolMigrated`, `MigrateTypeNotMatch`, `InvalidCpSwapConfig`, `MathOverflow`.

## `CollectFee`

단일 출시에서 프로토콜의 누적 거래 수수료에 대한 관리자 수집.

**인수** — 없음.

**계정**

| # | 이름                        | W | S | 참고                                           |
| - | ------------------------- | - | - | -------------------------------------------- |
| 1 | `protocol_fee_owner`      |   | S | `global_config.protocol_fee_owner`와 같아야 합니다. |
| 2 | `authority`               |   |   | PDA `[b"vault_auth_seed"]`; 볼트 이전에 서명합니다.    |
| 3 | `pool_state`              | W |   | `quote_protocol_fee`를 0으로 만들기 위해 변경됩니다.      |
| 4 | `global_config`           |   |   | 서명자의 진실의 원천.                                 |
| 5 | `quote_vault`             | W |   | `quote_protocol_fee`로 드레인됩니다.                |
| 6 | `recipient_token_account` | W |   | `protocol_fee_owner`의 `quote_mint`에 대한 ATA.  |
| 7 | `quote_mint`              |   |   |                                              |
| 8 | `token_program`           |   |   | SPL Token (견적 민트는 항상 SPL Token).             |

**효과** — `quote_vault`에서 `recipient_token_account`로 `pool_state.quote_protocol_fee`를 이전한 다음 카운터를 0으로 설정합니다. 첫 매수 후 언제든지 호출 가능합니다.

## `CollectMigrateFee`

졸업 시 누적된 마이그레이션 수수료의 관리자 수집. `CollectFee`와 동일한 계정 형태이지만 `protocol_fee_owner` 대신 서명자로 `migrate_fee_owner`를 사용하고 `pool_state.migrate_fee`를 드레인 카운터로 사용합니다.

## `ClaimCreatorFee`

생성자가 소유한 **동일한 견적 민트를 사용하는 모든 출시**에 걸쳐 누적된 생성자 수수료의 생성자별 수집. 풀별 항목이 아닌 생성자별 수수료 볼트를 드레인합니다.

**인수** — 없음.

**계정**

| # | 이름                         | W | S | 참고                                                 |
| - | -------------------------- | - | - | -------------------------------------------------- |
| 1 | `creator`                  | W | S | 풀 생성자.                                             |
| 2 | `fee_vault_authority`      |   |   | PDA `[b"creator_fee_vault_auth_seed"]`.            |
| 3 | `creator_fee_vault`        | W |   | 시드 `[creator, quote_mint]`에서 PDA; 집계된 생성자 볼트.      |
| 4 | `recipient_token_account`  | W |   | `init_if_needed`; `creator`의 `quote_mint`에 대한 ATA. |
| 5 | `quote_mint`               |   |   |                                                    |
| 6 | `token_program`            |   |   |                                                    |
| 7 | `system_program`           |   |   | 필요하면 ATA 생성용.                                      |
| 8 | `associated_token_program` |   |   |                                                    |

**효과** — `creator_fee_vault`의 전체 잔액을 `recipient_token_account`로 이전합니다. 볼트가 비어 있으면 0보다 큼 검사로 되돌립니다.

## `ClaimPlatformFee`

출시의 견적 볼트를 직접 드레인하는 플랫폼별 수집. 집계된 플랫폼 볼트를 거치지 않고 플랫폼이 특정 출시에 대한 조각을 청구하려고 할 때 사용합니다.

**인수** — 없음.

**계정**

| #  | 이름                         | W | S | 참고                                              |
| -- | -------------------------- | - | - | ----------------------------------------------- |
| 1  | `platform_fee_wallet`      | W | S | `platform_config.platform_fee_wallet`과 같아야 합니다. |
| 2  | `authority`                |   |   | PDA `[b"vault_auth_seed"]`.                     |
| 3  | `pool_state`               | W |   | `pool_state.platform_fee`로 드레인됩니다.              |
| 4  | `platform_config`          |   |   | 서명자의 진실의 원천.                                    |
| 5  | `quote_vault`              | W |   | 드레인됩니다.                                         |
| 6  | `recipient_token_account`  | W |   | `init_if_needed`; `platform_fee_wallet`의 ATA.   |
| 7  | `quote_mint`               |   |   |                                                 |
| 8  | `token_program`            |   |   |                                                 |
| 9  | `system_program`           |   |   |                                                 |
| 10 | `associated_token_program` |   |   |                                                 |

**효과** — `quote_vault`에서 `recipient_token_account`로 `pool_state.platform_fee`를 이전하고 카운터를 0으로 설정합니다.

## `ClaimPlatformFeeFromVault`

플랫폼별 집계 수집. 플랫폼을 통해 라우팅된 모든 출시에서 수수료가 누적되는 견적 민트당 플랫폼 수수료 볼트를 드레인합니다.

**인수** — 없음.

**계정**

| # | 이름                         | W | S | 참고                                              |
| - | -------------------------- | - | - | ----------------------------------------------- |
| 1 | `platform_fee_wallet`      | W | S | `platform_config.platform_fee_wallet`과 같아야 합니다. |
| 2 | `fee_vault_authority`      |   |   | PDA `[b"platform_fee_vault_auth_seed"]`.        |
| 3 | `platform_config`          |   |   |                                                 |
| 4 | `platform_fee_vault`       | W |   | 시드 `[platform_config, quote_mint]`에서 PDA.       |
| 5 | `recipient_token_account`  | W |   | `init_if_needed`; `platform_fee_wallet`의 ATA.   |
| 6 | `quote_mint`               |   |   |                                                 |
| 7 | `token_program`            |   |   |                                                 |
| 8 | `system_program`           |   |   |                                                 |
| 9 | `associated_token_program` |   |   |                                                 |

**효과** — `platform_fee_vault`의 전체 잔액을 `recipient_token_account`로 이전합니다. 볼트가 비어 있으면 되돌립니다.

## 베스팅 및 플랫폼 설정 명령어

이들은 전용 페이지에 문서화되어 있습니다. 각각 자체 상태 모델을 가지고 있기 때문입니다:

* [`CreateVestingAccount`, `CreatePlatformVestingAccount`, `ClaimVestedToken`](/ko/products/launchlab/vesting)
* [`CreatePlatformConfig`, `UpdatePlatformConfig`, `UpdatePlatformCurveParam`, `RemovePlatformCurveParam`, `CreatePlatformGlobalAccess`, `ClosePlatformGlobalAccess`](/ko/products/launchlab/platform-config)
* [`CreateConfig`, `UpdateConfig`](/ko/products/launchlab/global-config)

## 상태 변화 행렬

| 명령어                                     | `status`   | `real_base` | `real_quote`     | 수수료 카운터                                        | 졸업 후 풀                           |
| --------------------------------------- | ---------- | ----------- | ---------------- | ---------------------------------------------- | -------------------------------- |
| `Initialize{V2,WithToken2022}`          | Funding    | 0           | 0                | 0                                              | —                                |
| `BuyExactIn(q_in)`                      | Funding    | +∆          | +∆q\_after\_fee  | `quote_protocol_fee += ∆`, `platform_fee += ∆` | —                                |
| `SellExactIn(b_in)`                     | Funding    | −∆          | −∆q\_before\_fee | (동일)                                           | —                                |
| 임계값 도달                                  | → Migrate  | —           | —                | —                                              | —                                |
| `MigrateToAmm` / `MigrateToCpswap`      | → Migrated | (고정)        | (고정)             | `migrate_fee` 설정                               | 생성됨, LP는 `PlatformConfig`에 따라 분할 |
| `CollectFee` / `CollectMigrateFee`      | 임의         | —           | —                | 카운터 0으로 설정                                     | —                                |
| `ClaimCreatorFee` / `ClaimPlatformFee*` | 임의         | —           | —                | 볼트 드레인                                         | —                                |
| `CreateVestingAccount`                  | Funding    | —           | —                | —                                              | `allocated_share_amount` 범프      |
| `ClaimVestedToken`                      | Migrated   | —           | —                | —                                              | `base_vault` 드레인                 |

## 다음 단계

* [`products/launchlab/code-demos`](/ko/products/launchlab/code-demos) — 각 명령어에 대한 TypeScript 예제.
* [`products/launchlab/accounts`](/ko/products/launchlab/accounts) — 전체 상태 형태.
* [`reference/error-codes`](/ko/reference/error-codes) — LaunchLab 오류 열거형.

출처:

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