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

# Instruksi LaunchLab

> Initialize, Buy, Sell, Graduate, CollectFees, SetParams — bentuk argumen, daftar akun, dan kondisi pre/post untuk setiap instruksi LaunchLab.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/products/launchlab/instructions)
</Info>

<Info>
  LaunchLab mengekspos set instruksi yang ketat: enam panggilan yang menghadap pengguna ditambah beberapa primitif admin. SDK membungkus semuanya; halaman ini mendokumentasikan permukaan mentah untuk agregator, alat pemantauan, dan program yang memerlukan CPI.

  Upgrade program 2026-09 membangun kembali LaunchLab di Anchor 1.0.2 / Solana 3.1.10 dan menghapus tiga mekanisme transisi: `Initialize` yang sudah usang sekarang selalu gagal, `MigrateToAmm` kehilangan tiga argumennya dan setiap akun OpenBook, dan gerbang `get_upgrade_timestamp` yang membuat beberapa pemeriksaan bersyarat pada jam sudah hilang. Ini juga menambahkan satu instruksi admin, `CollectExcessLamports`. Lihat [entri changelog 2026-09-09](/id/reference/changelog/2026-09-09-launchlab-anchor-1-and-excess-lamports).
</Info>

## Inventaris instruksi

| Grup | Instruksi | Dapat dipanggil oleh |
| - | - | - |
| Konfigurasi global | `CreateConfig` / `UpdateConfig` | Admin program; otoritas create-config yang didelegasikan juga dapat memanggil `CreateConfig` |
| Siklus peluncuran | `Initialize` | **Tidak ada — selalu gagal dengan `NotApproved`.** Dipertahankan hanya agar diskriminator tetap terisi dan IDL tetap stabil. Gunakan `InitializeV2`. |
| Siklus peluncuran | `InitializeV2` | Siapa saja (pembuat) — mint dasar SPL Token; mencatat `amm_creator_fee_on` untuk kelulusan CPMM yang akan datang, dan menerima mint kutipan Token-2022. |
| Siklus peluncuran | `InitializeWithToken2022` | Siapa saja (pembuat) — mint dasar Token-2022, `TransferFeeConfig` opsional; menerima program token kutipan apa pun |
| Perdagangan | `BuyExactIn` / `BuyExactOut` | Siapa saja — pembelian input-tepat / output-tepat pada kurva ikatan |
| Perdagangan | `SellExactIn` / `SellExactOut` | Siapa saja — penjualan input-tepat / output-tepat pada kurva ikatan |
| Kelulusan | `MigrateToAmm` | Dompet migrasi — kelulusan AMM v4 warisan untuk pool yang diinisialisasi sebelum penegakan pembuatan CPMM-only. Tidak mengambil argumen dan tidak ada akun OpenBook sejak 2026-09. |
| Kelulusan | `MigrateToCpswap` | Dompet migrasi — lulus ke CPMM. Semua peluncuran yang baru diinisialisasi menggunakan jalur ini. Membungkus `InitializeWithPermission` pada CPMM. |
| Biaya | `CollectFee` | Admin — sapukan biaya protokol dari peluncuran |
| Biaya | `CollectMigrateFee` | Admin — sapukan biaya migrasi yang terkumpul |
| Biaya | `ClaimCreatorFee` | Pembuat — klaim biaya pembuat yang terkumpul selama fase kurva |
| Vesting | `CreateVestingAccount` | Pembuat — alokasikan token terkunci ke penerima manfaat, dibuka setelah kelulusan |
| Vesting | `CreatePlatformVestingAccount` | Admin platform — alokasikan token terkunci ke penerima manfaat sisi platform |
| Vesting | `ClaimVestedToken` | Penerima manfaat — klaim token yang tidak terkunci setelah tebing |
| Konfigurasi platform | `CreatePlatformConfig` / `UpdatePlatformConfig` | Admin platform |
| Konfigurasi platform | `CreatePlatformCurveRule` / `UpdatePlatformCurveRule` / `RemovePlatformCurveRule` / `ClosePlatformCurveRule` | `PlatformConfig.curve_rule_manager` atau admin platform — kelola aturan parameter peluncuran satu `GlobalConfig` |
| Biaya platform | `ClaimPlatformFee` / `ClaimPlatformFeeFromVault` | Admin platform |
| Akses platform | `CreatePlatformAllowConfig` / `ClosePlatformAllowConfig` | Admin platform — pertahankan daftar putih `GlobalConfig` yang digunakan ketika platform itu mengaktifkan pembatasan |
| Sewa | `CollectExcessLamports` | Admin program atau dompet collect-lamports khusus — sapukan lamport di atas minimum bebas sewa dari vault dan PDA yang dikendalikan LaunchLab. Ditambahkan 2026-09. |

Pemisahan "ExactIn/ExactOut" mencerminkan `SwapBaseInput` / `SwapBaseOutput` CPMM — di rantai mereka adalah diskriminator instruksi terpisah dengan pembulatan sedikit berbeda.

**Pemilihan jalur kelulusan.** Setiap panggilan `InitializeV2` dan `InitializeWithToken2022` baru harus menetapkan `migrate_type = 1` (`CPSWAP`). Setiap upaya untuk menginisialisasi pool baru yang terikat AMM v4 mengembalikan `MigrateTypeNotMatch`. `amm_creator_fee_on` hanya memilih apakah biaya pembuat CPMM yang dihasilkan berlaku untuk token kutipan atau kedua token; itu tidak memilih program target. `Initialize` warisan tidak dapat membuat peluncuran sama sekali lagi (lihat di bawah).

`MigrateToAmm` tetap dapat dipanggil untuk `PoolState` yang ada yang diinisialisasi dengan `migrate_type = 0` sebelum pembatasan ini. Rilis tidak menulis ulang status pool yang ada atau menghapus instruksi warisan.

**Program token sisi kutipan.** Mint kutipan dapat dimiliki oleh program SPL Token atau Token-2022. Setiap instruksi yang menyentuhnya — `CreateConfig`, `InitializeV2`, `InitializeWithToken2022`, keempat instruksi perdagangan, `CollectFee`, `CollectMigrateFee`, `ClaimCreatorFee`, `ClaimPlatformFee`, dan `ClaimPlatformFeeFromVault` — mengambil program pemilik di slot akun quote-program-nya. Posisi akun tidak berubah; hanya nilai yang diterima yang berubah. Lewatkan program yang benar-benar memiliki `GlobalConfig.quote_mint`, yang dapat Anda baca dari bit1 `PoolState.token_program_flag` untuk peluncuran yang ada (lihat [`accounts`](/id/products/launchlab/accounts#poolstate)) atau dari pemilik akun mint sebaliknya.

`Initialize` yang sudah usang tidak relevan di sini: akun quote-program-nya masih diketik ke SPL Token, dan sejak upgrade 2026-09 instruksi gagal sebelum membaca akun apa pun. Luncurkan melalui `InitializeV2` atau `InitializeWithToken2022`.

`MigrateToCpswap` adalah pengecualian lainnya, dalam arah yang berlawanan — mengambil **kedua** program tanpa syarat daripada satu per mint. Lihat [akun migrasi di bawah](#cpmm-migration-token-programs).

## `Initialize`

<Warning>
  **Dihapus secara efektif sejak upgrade 2026-09 — instruksi ini selalu gagal.** Handler `initialize` sekarang hanya log `Not supported. Please use initialize_v2 instruction` dan `NotApproved` (`6000`). Itu dipertahankan murni agar diskriminatornya tetap terisi dan IDL tetap mempertahankan bentuk yang stabil. (Struct `Accounts` tidak berubah, jadi validasi yang dihasilkan Anchor masih berjalan terlebih dahulu; transaksi kembali terlepas dari apa pun.)

  Sebelumnya itu dijaga pada jam: itu bekerja sampai tiga hari setelah cutover `get_upgrade_timestamp` dan gagal setelahnya. Pembantu timestamp itu hilang, jadi kegagalan sekarang tanpa syarat. Peluncuran yang ada yang dibuat melaluinya tidak terpengaruh — mereka berdagang dan lulus secara normal melalui `MigrateToAmm` atau `MigrateToCpswap` tergantung pada `migrate_type` yang disimpan mereka.

  Argumen dan daftar akun di bawah adalah milik `InitializeV2`. `Initialize` yang sudah usang
  mengambil 18 akun yang sama dalam urutan yang sama dan hanya tiga argumen pertama — ia tidak
  memiliki `amm_fee_on` — dan slot `quote_token_program`-nya bertipe SPL Token, bukan
  `Interface<TokenInterface>`.
</Warning>

Buat peluncuran baru. `InitializeV2` hanya menambahkan argumen `amm_fee_on` di atas `Initialize` yang sudah usang; **jumlah dan urutan akunnya identik**, dan satu-satunya perbedaan di tingkat akun adalah `quote_token_program` bertipe `Interface<TokenInterface>` sehingga quote mint Token-2022 diterima.

**Argumen**

Empat argumen posisional, bukan satu struct. (`InitializeWithToken2022` menambahkan yang kelima, `transfer_fee_extension_param: Option<TransferFeeExtensionParams>`; `Initialize` yang sudah usang tidak memiliki `amm_fee_on`.)

```rust theme={null}
base_mint_param: MintParams {
    decimals: u8,                 // must equal the program's BASE_MINT_DECIMALS
    name:     String,
    symbol:   String,
    uri:      String,
}

curve_param: CurveParams {        // Borsh enum — one leading variant-tag byte
    Constant { data: ConstantCurve { supply: u64, total_base_sell: u64,
                                     total_quote_fund_raising: u64, migrate_type: u8 } },
    Fixed    { data: FixedCurve    { supply: u64,
                                     total_quote_fund_raising: u64, migrate_type: u8 } },
    Linear   { data: LinearCurve   { supply: u64,
                                     total_quote_fund_raising: u64, migrate_type: u8 } },
}

vesting_param: VestingParams {
    total_locked_amount: u64,     // 0 requires cliff_period == unlock_period == 0
    cliff_period:        u64,     // seconds after fundraising ends
    unlock_period:       u64,     // seconds
}

amm_fee_on: AmmCreatorFeeOn       // 0 = QuoteToken, 1 = BothToken (CPMM migrations only)
```

Varian tersebut harus cocok dengan `global_config.curve_type` atau instruksi dibatalkan dengan `InputNotMatchCurveConfig` (`6003`). Tidak ada `open_time`, tidak ada argumen `quote_mint` (nilainya berasal dari `global_config`), tidak ada struct `fees` dan tidak ada `post_graduation_lp_policy` — pelepasan LP diatur pada `PlatformConfig`, bukan per peluncuran.

**Akun** — 18 total (16 dideklarasikan ditambah dua yang ditambahkan oleh `#[event_cpi]`)

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `payer` | W | S | Membayar semua sewa. Tidak harus kreator. |
| 2 | `creator` | | | Dicatat sebagai `pool_state.creator`; bukan penandatangan. |
| 3 | `global_config` | | | Menyediakan quote mint, tipe kurva dan setiap lantai/batas. |
| 4 | `platform_config` | | | Menyediakan tarif biaya platform dan kebijakan pelepasan LP. |
| 5 | `authority` | | | PDA `["vault_auth_seed"]` — satu PDA global, dibagi oleh semua peluncuran. |
| 6 | `pool_state` | W | | Akun baru. |
| 7 | `base_mint` | W | S | Keypair baru — instruksi ini menginisialisasinya. |
| 8 | `quote_mint` | | | Harus sama dengan `global_config.quote_mint`. |
| 9 | `base_vault` | W | | PDA `["pool_vault", pool_state, base_mint]`. |
| 10 | `quote_vault` | W | | PDA `["pool_vault", pool_state, quote_mint]`. |
| 11 | `metadata_account` | W | | PDA metadata Metaplex. |
| 12 | `base_token_program` | | | SPL Token untuk `InitializeV2`; Token-2022 untuk `InitializeWithToken2022`. |
| 13 | `quote_token_program` | | | Program yang memiliki `quote_mint` — SPL Token atau Token-2022. |
| 14 | `metadata_program` | | | Metaplex Token Metadata. |
| 15 | `system_program` | | | |
| 16 | `rent_program` | | | Sysvar rent. |
| 17 | `event_authority` | | | PDA `["__event_authority"]`; ditambahkan oleh `#[event_cpi]`. |
| 18 | `program` | | | ID program LaunchLab; ditambahkan oleh `#[event_cpi]`. |

**Kondisi awal**

* `quote_mint ∈ launch_config.allowed_quote_mints`.
* `base_supply_graduation ≤ base_supply_max`.
* Parameter biaya lulus pemeriksaan `launch_config.max_*_fee_rate`.
* `open_time ≥ now − slop` (SDK memberlakukan `≥ now`; program mentoleransi backdating ringan).
* `curve_type` dikenali.

**Kondisi akhir**

* `base_mint` memiliki `supply = curve_param.supply`, semuanya di `base_vault`.
* Otoritas mint **dicabut** di dalam instruksi yang sama ini (`set_authority(MintTokens, None)`) tepat setelah supply dicetak — bukan pada saat kelulusan. Karena itu base mint permanen bersupply tetap, dan tidak ada instruksi berikutnya yang dapat mencetak lebih banyak.
* `PoolState` diinisialisasi dengan `status = Fund` (`0`), `real_a = 0`, `real_b = 0`.
* `total_fund_raising_b` berasal langsung dari `curve_param.total_quote_fund_raising`.
* Untuk `InitializeWithToken2022` dengan `TransferFeeConfig` terlampir: `transfer_fee_config_authority = launch_authority`, dan `withdraw_withheld_authority = PlatformConfig.transfer_fee_extension_auth` ketika bidang itu diatur, sebaliknya `launch_authority`. Sisi penarikan ditulis pada pembuatan mint tepatnya sehingga platform dapat menyapu biaya yang ditahan sebelum kelulusan. Lihat [`platform-config`](/id/products/launchlab/platform-config#token-2022-transfer-fee-authorities).

**Kesalahan umum** — `NotApproved` (`6000`, tanpa syarat, untuk `Initialize` yang sudah usang), `InvalidInput` (`6002`, lantai supply / rate / penggalangan dana dari `GlobalConfig` dilanggar), `InputNotMatchCurveConfig` (`6003`, varian `curve_param` tidak cocok dengan `global_config.curve_type`), `MigrateTypeNotMatch` (`6007`, `migrate_type != 1`), `MathOverflow` (`6008`), `VestingRatioTooHigh` (`6010`), `NoSupportExtension` (`6017`), `NotEnoughRemainingAccounts` (`6018`), `InvalidPlatformAllowConfig` (`6022`), `CurveParamNotMatchPlatformRule` (`6025`). Pemeriksaan Anchor `address =` / `constraint =` yang gagal muncul sebagai kode 2xxx, bukan salah satu dari kode di atas — tidak ada `InvalidQuoteMint`, `FeeRateTooHigh` maupun `InvalidCurveParams` di enum error program.

## `Buy` (varian kanonik: `BuyExactIn`)

Pengguna menyediakan jumlah input tetap; kurva menghitung outputnya.

**Argumen**

```
amount_in:           u64
minimum_amount_out:  u64
share_fee_rate:      u64   // referral fee on a 1_000_000 denominator; must be
                           // <= global_config.max_share_fee_rate. Pass 0 for no
                           // referral. Any non-zero value requires the share-fee
                           // receiver as remaining_accounts[0].
```

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `payer` | W | S | Trader. |
| 2 | `authority` | | | PDA `["vault_auth_seed"]` — satu PDA global, tanpa seed per-peluncuran. |
| 3 | `global_config` | | | `address = pool_state.global_config`. |
| 4 | `platform_config` | | | `address = pool_state.platform_config`. |
| 5 | `pool_state` | W | | |
| 6 | `user_base_token` | W | | `token::mint = base_token_mint`. |
| 7 | `user_quote_token` | W | | `token::mint = quote_token_mint`. |
| 8 | `base_vault` | W | | `address = pool_state.base_vault`. |
| 9 | `quote_vault` | W | | `address = pool_state.quote_vault`. |
| 10 | `base_token_mint` | | | |
| 11 | `quote_token_mint` | | | |
| 12 | `base_token_program` | | | Program yang memiliki base mint — SPL Token atau Token-2022. |
| 13 | `quote_token_program` | | | Program yang memiliki quote mint. |
| 14 | `event_authority` | | | PDA `["__event_authority"]`; ditambahkan oleh `#[event_cpi]`. |
| 15 | `program` | | | ID program LaunchLab; ditambahkan oleh `#[event_cpi]`. |

**Remaining accounts** — pipa biaya, dibaca dalam urutan persis ini:

1. `share_fee_receiver` — **hanya** ketika `share_fee_rate > 0`.
2. `system_program` — selalu; diperiksa `== System::id()`, jika tidak `InvalidInput`.
3. `platform_fee_vault` — PDA `[platform_config, quote_token_mint]`; dibuat saat pertama kali dipakai.
4. `creator_fee_vault` — PDA `[creator, quote_token_mint]`; dibuat saat pertama kali dipakai.

Kekurangan akun mengembalikan `NotEnoughRemainingAccounts` (`6018`). Tidak ada slot
`associated_token_program`, dan `system_program` adalah akun *remaining*, bukan akun yang dideklarasikan.

**Kondisi awal**

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

**Efek**

1. Pisahkan `quote_in` menjadi `quote_in_after_fee` dan bagian biaya.
2. Newton-selesaikan kurva untuk `base_out` yang diberikan kutipan pasca-biaya.
3. `require(base_out ≥ minimum_base_out)` sebaliknya kembali `ExceededSlippage`.
4. Pindahkan `quote_in` pengguna → vault. Pindahkan `base_out` vault → pengguna.
5. Perbarui `base_sold += base_out`, `quote_reserve_real += quote_in_after_fee × (lp_share / total_share)`.
6. Perbarui penghitung biaya (`protocol_fees_quote`, `creator_fees_quote`).
7. `state_data.num_buys += 1`.
8. Jika `quote_reserve_real ≥ quote_reserve_target` setelah pembaruan, SDK biasanya merantai instruksi `Graduate` dalam transaksi yang sama. Program tidak auto-graduate di dalam `Buy` — `Graduate` berikutnya diperlukan.

## `BuyExactOut`

Pengguna menentukan `base_out` yang tepat; program menghitung `quote_in`.

**Argumen**

```
amount_out:         u64
maximum_amount_in:  u64
share_fee_rate:     u64   // as for BuyExactIn
```

Akun yang sama dan kontrak remaining-account yang sama seperti `BuyExactIn`. Menggunakan integral kuadrat bentuk tertutup (atau CPMM terbalik, untuk curve\_type 1) daripada iterasi Newton.

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

Cerminan dari `Buy`. Pengguna mengembalikan `base_in` ke kurva dan menerima `quote_out`. Biaya dikurangkan dari `quote_out`, jadi pengguna menerima lebih sedikit daripada hasil terintegrasi mentah.

**Kondisi awal** —

* `user_base_ata.balance ≥ base_in`.
* Penjualan tidak dapat mendorong `base_sold` di bawah 0 (berlebihan dengan di atas mengingat akuntansi konsisten).
* Peluncuran adalah `Active`.

**Efek** — simetris dengan `Buy`. `base_sold` berkurang, `quote_reserve_real` berkurang. Biaya masih terkumpul.

### Biaya transfer sisi kutipan

Ketika mint kutipan membawa `TransferFeeConfig`, jumlah yang dipindahkan vault dan jumlah yang didebit atau dikreditkan pembayar berbeda, dan batas slippage diperiksa terhadap sisi pembayar. Pada mint kutipan tanpa ekstensi setiap kasus di bawah identik dengan mint warisan biasa.

| Instruksi | Argumen | Diperiksa terhadap |
| - | - | - |
| `BuyExactIn` | `amount_in` | Kurva dihargai pada `amount_in − transfer_fee(amount_in)` — apa yang mencapai vault. Pengisian penuh mendebit tepat `amount_in`; pengisian sebagian mendebit jumlah vault yang dikonsumsi ditambah biaya terbaliknya. |
| `BuyExactOut` | `maximum_amount_in` | Jumlah vault **ditambah** biaya transfer terbalik — debit nyata. |
| `SellExactIn` | `minimum_amount_out` | Apa yang disimpan penjual setelah mint menahan biayanya, bukan jumlah kotor yang meninggalkan vault. |
| `SellExactOut` | `amount_out` | Disampaikan dengan tepat. Kurva menargetkan `amount_out` ditambah biaya transfer terbalik. |

Dua konsekuensi untuk penawaran:

* Batas yang dihitung seolah-olah mint bebas biaya ditolak. Melewatkan biaya-bebas biaya sebagai `maximum_amount_in`, atau hasil bebas-biaya sebagai `minimum_amount_out`, kembali dengan `ExceededSlippage`.
* `real_quote` maju hanya dengan apa yang mencapai vault. `BuyExactIn` dari `amount_in` pada mint kutipan 5% memindahkan `real_quote` sebesar `amount_in × 0.95`.

Mint kutipan 100%-biaya (`10000` basis poin) tidak dapat dibalik dan kembali dengan `CalculateOverflow` pada jalur exact-out.

Kedua mint sisi perdagangan juga dibatasi pada program yang dilewatkan di slot pencocokan mereka, jadi `base_token_program` yang tidak cocok sekarang gagal daripada diabaikan. Lihat [`algorithms/token-2022-transfer-fees`](/id/algorithms/token-2022-transfer-fees) untuk matematika biaya yang mendasar.

### Akun sisa perdagangan

Keempat instruksi perdagangan mengambil pipa biaya mereka melalui `remaining_accounts`, dalam urutan ini:

| Indeks | Akun | Kapan |
| - | - | - |
| 0 | `share_fee_receiver` | Hanya ketika `share_fee_rate > 0`. Menggeser setiap indeks di bawah satu ketika ada. |
| berikutnya | `system_program` | Selalu. Dana pembuatan fee-vault. |
| berikutnya | `platform_fee_vault` | Selalu. PDA di seed `[platform_config, quote_token_mint]`, dibuat pada penggunaan pertama. |
| berikutnya | `creator_fee_vault` | Selalu. PDA di seed `[creator, quote_token_mint]`, dibuat pada penggunaan pertama. |

<Note>
  **Berubah di 2026-09: tiga terakhir sekarang tanpa syarat, dan `system_program` divalidasi.** Sebelum rilis ini program hanya membacanya ketika `unix_timestamp >= get_upgrade_timestamp()`, dan melewatkan pemisahan biaya platform/pembuat sepenuhnya sebelum saat itu. Timestamp sudah lama berlalu, jadi perilaku di mainnet tidak berubah dalam praktik — tetapi cabang hilang dari kode, dan pembangun yang masih menghilangkan tiga akun sekarang selalu gagal dengan `NotEnoughRemainingAccounts` (`6018`) daripada hanya setelah cutover. Slot `system_program` juga diperiksa terhadap `System::id()` dan mengembalikan `InvalidInput` (`6002`) jika menyimpan apa pun yang lain, di mana sebelumnya akun apa pun diterima di posisi itu.
</Note>

## `MigrateToAmm` / `MigrateToCpswap`

Lulus peluncuran ke pool yang dapat diperdagangkan setelah kurva mencapai `total_quote_fund_raising`. Peluncuran baru adalah CPMM-only. `MigrateToAmm` dipertahankan untuk pool yang ada yang `migrate_type` tersimpan adalah `0`.

**Siapa yang menandatangani**

* `MigrateToAmm` — `migrate_to_amm_wallet` yang dicatat pada `GlobalConfig` pengikatan.
* `MigrateToCpswap` — `migrate_to_cpswap_wallet` yang dicatat pada `GlobalConfig` pengikatan.

Dompet ini biasanya dipegang oleh crank kelulusan yang dioperasikan Raydium; dalam praktik kelulusan mendarat detik setelah ambang batas terlampaui, terlepas dari siapa yang memicu pembelian terakhir.

**Argumen**

Tidak ada satupun.

<Warning>
  **Perubahan yang merusak (dompet migrasi saja, 2026-09).** `MigrateToAmm` menghapus ketiga argumen — `base_lot_size`, `quote_lot_size`, `market_vault_signer_nonce` — **dan sembilan akun**. Data instruksinya sekarang diskriminator telanjang, jadi pembangun lama mengirim 17 byte argumen yang tidak terduga dan menyediakan daftar akun yang tidak lagi selaras.

  Ini mengikuti [penghapusan OpenBook](/id/reference/changelog/2026-07-22-amm-v4-openbook-removal) AMM v4 sendiri: `Initialize2` AMM v4 tidak lagi mengambil `market_program` atau `amm_open_orders`, jadi LaunchLab tidak memiliki apa pun yang tersisa untuk diteruskan. Program juga berhenti CPI-ing `initialize_openbook_market`, yang merupakan konfigurasi tiga argumen.

  Akun dihapus: `openbook_program`, `request_queue`, `event_queue`, `bids`, `asks`, `market_vault_signer`, `market_base_vault`, `market_quote_vault`, dan `amm_open_orders`. Akun `market` **tetap** di posisinya — AMM v4 masih mencatatnya sebagai bidang referensi — tetapi sekarang dideklarasikan sebagai `#[account(mut)]` telanjang: tidak ada pemilik, alamat atau batasan seed. Itu sepenuhnya tidak divalidasi, itu diteruskan langsung ke CPI `Initialize2` AMM v4, dan program tidak lagi menginisialisasinya. Pemanggil yang menginginkan akun pasar menjadi pasar yang benar-benar diinisialisasi harus membuatnya sendiri sebelumnya.

  Daftar 23-akun yang tersisa adalah, dalam urutan: `payer`, `base_mint`, `quote_mint`, `market`, `amm_program`, `amm_pool`, `amm_authority`, `amm_lp_mint`, `amm_base_vault`, `amm_quote_vault`, `amm_target_orders`, `amm_config`, `amm_create_fee_destination`, `authority`, `pool_state`, `global_config`, `base_vault`, `quote_vault`, `pool_lp_token`, `spl_token_program`, `associated_token_program`, `system_program`, `rent_program`.

  `MigrateToCpswap` tidak terpengaruh — itu tidak pernah memiliki argumen.
</Warning>

**Efek (umum untuk keduanya)**

1. Verifikasi `pool_state.status == Migrate` (yaitu, `quote_reserve_target` telah tercapai). Sebaliknya kembali dengan `PoolMigrated` (status sudah `Migrated`) atau `PoolFunding` (masih dalam pendanaan).
2. Verifikasi `pool_state.migrate_type` cocok dengan instruksi (`0` untuk AMM, `1` untuk CPMM). Sebaliknya kembali dengan `MigrateTypeNotMatch`.
3. Hitung cadangan pasca-kelulusan:
   * `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. CPI ke program target (`AMM v4 Initialize2` atau `CPMM InitializeWithPermission`) dengan cadangan tersebut untuk membuat pool pasca-kelulusan.
5. Untuk migrasi CPMM yang dieksekusi setelah upgrade 2026-08-17, gabungkan `platform_scale + creator_scale` menjadi satu saham LP terkunci milik platform dan mint paling banyak satu Fee Key NFT ke `platform_nft_wallet`. Bakar sisa `burn_scale`. Sebelum upgrade, `creator_scale` dikunci secara terpisah dan Fee Key-nya pergi ke pembuat token. Migrasi historis yang selesai tidak dimodifikasi. Untuk kelulusan AMM v4 warisan, disposisi LP mengikuti aliran yang ada dari instruksi itu.
6. (Tidak ada langkah mint-authority. `base_mint.mint_authority` sudah diatur ke `None` pada pembuatan peluncuran — lihat catatan di bawah.)
7. Balik `pool_state.status = Migrated`, atur `vesting_schedule.start_time = block_time + cliff_period`.

**Penyerahan otoritas transfer-fee Token-2022** — ketika mint dasar adalah mint Token-2022 yang membawa `TransferFeeConfig` **dan** `PlatformConfig.transfer_fee_extension_auth` bukan default, migrasi juga menetapkan kembali otoritas ekstensi itu ke kunci platform:

* `transfer_fee_config_authority` selalu ditetapkan kembali. PDA `authority` peluncuran memegangnya untuk seluruh fase pra-kelulusan, jadi selalu ada sesuatu untuk dipindahkan.
* `WithheldWithdraw` ditetapkan kembali **hanya ketika PDA `authority` masih memegangnya**. Peluncuran yang dibuat dari 2026-08-27 ke depan sudah membawa `transfer_fee_extension_auth` pada otoritas itu dari pembuatan mint, jadi langkah dilewati. Penjaga adalah apa yang membuat migrasi tidak kembali pada mint tersebut — PDA tidak dapat menandatangani otoritas yang tidak lagi dipegang.

Jika `transfer_fee_extension_auth` adalah `Pubkey::default()` pada waktu migrasi, tidak ada otoritas yang bergerak dan keduanya tetap dengan PDA `authority` selamanya. Lihat [`platform-config`](/id/products/launchlab/platform-config#token-2022-transfer-fee-authorities).

<Note>
  **Pasokan mint dasar tetap dari pembuatan, bukan dari kelulusan.** `InitializeV2` dan `InitializeWithToken2022` mencetak seluruh pasokan ke vault dasar dan kemudian segera mencabut `MintTokens` dalam instruksi yang sama, jadi `base_mint.mint_authority` adalah `None` untuk seluruh kehidupan peluncuran. Migrasi tidak menyentuhnya. (Revisi sebelumnya dari halaman ini menempatkan pencabutan pada kelulusan; itu salah.) Satu-satunya otoritas yang dapat dipindahkan migrasi adalah yang Token-2022 transfer-fee yang dijelaskan di bawah.
</Note>

**Kondisi akhir** — `BuyExactIn`, `BuyExactOut`, `SellExactIn`, `SellExactOut` akan menolak dari titik ini dengan `PoolMigrated`. Pool AMM yang dihasilkan adalah kanonik dan berdagang seperti pool AMM v4 / CPMM lainnya.

**Kesalahan umum** — `PoolFunding`, `PoolMigrated`, `MigrateTypeNotMatch`, `InvalidCpSwapConfig`, `MathOverflow`.

### Akun sisa migrasi CPMM

Klien yang membangun `MigrateToCpswap` harus menggunakan indeks `remaining_accounts` tetap ini:

| Indeks | Akun |
| - | - |
| 0–4 | Pemilik Fee Key Platform, mint, akun token, PDA likuiditas terkunci, dan akun metadata |
| 5 | Pembuat peluncuran asli; digunakan ketika `platform_cp_creator` tidak diatur |
| 6 | PDA izin CPMM yang diturunkan dari `[b"permission", launch_authority]` |
| 7 | `platform_cp_creator` yang dikonfigurasi; digunakan ketika bidang bukan default |
| 8 | PDA support-mint CPMM untuk `mint0` yang disortir, diturunkan dari `[b"support_mint", mint0]` |
| 9 | PDA support-mint CPMM untuk `mint1` yang disortir, diturunkan dari `[b"support_mint", mint1]` |

Instruksi memerlukan setidaknya sepuluh akun yang tersisa. Akun support-mint adalah input CPI read-only. Turunkan kedua alamat bahkan ketika mint tidak memiliki catatan dukungan yang diinisialisasi. Pembangun yang lebih lama yang masih menambahkan akun creator-lock atau menghilangkan indeks 8–9 harus diperbarui.

<Note>
  **Berubah di 2026-09.** Dua pembersihan, tidak satupun yang mengubah pembangun yang benar:

  * **Jalur CPMM berizin sekarang adalah satu-satunya jalur.** `MigrateToCpswap` dulu memilih antara `InitializeCpSwap` dan `InitializeCpSwapWithPermission` berdasarkan `unix_timestamp >= get_upgrade_timestamp()`. Pembantu timestamp dan CPI warisan keduanya hilang, jadi jalur berizin — dan oleh karena itu minimum sepuluh akun — berlaku tanpa syarat.
  * **Tiga batasan alamat dipindahkan dari struct akun ke badan instruksi.** `platform_config`, `base_vault`, dan `quote_vault` masih diperlukan untuk cocok dengan nilai yang disimpan pada `PoolState`, tetapi ketidakcocokan sekarang dimunculkan oleh `require_keys_eq!` daripada oleh batasan `address =` Anchor. Pemeriksaan setara; hanya permukaan kesalahan yang berbeda — Anda mendapatkan `RequireKeysEqViolated` (`2502`) Anchor yang generik daripada `ConstraintAddress` (`2012`), dan itu dilaporkan tanpa nama akun. Perbarui penanganan kesalahan apa pun yang cocok pada `2012` untuk ketiga akun ini.
</Note>

### Program token migrasi CPMM

`MigrateToCpswap` mengambil kedua program token tanpa syarat dan mengetahui program mana yang memiliki setiap mint. Dua akun program token-nya dinamai ulang sesuai:

| Posisi | Akun | Nilai |
| - | - | - |
| pertama | `token_program` | Selalu program SPL Token warisan |
| kedua | `token_program_2022` | Selalu program Token-2022 |

Mereka menggantikan `base_token_program` (program mana pun yang memiliki mint dasar) dan `quote_token_program` (selalu warisan) sebelumnya. Posisi tidak berubah, jadi ini adalah perubahan nilai daripada perubahan tata letak — tetapi dua nilai hampir terbalik, dan pembangun yang terus melewatkan pasangan lamanya akan memasok Token-2022 di mana program warisan diperlukan segera setelah salah satu mint adalah mint Token-2022.

Program warisan diperlukan bahkan ketika tidak ada mint yang menggunakannya, karena mint LP CPMM dan Fee Key NFT likuiditas terkunci selalu hidup di atasnya.

## Daftar putih `GlobalConfig` Platform

`PlatformConfig.restrict_global_config` mengontrol pemeriksaan:

* `0`: platform menerima `GlobalConfig` apa pun yang sebaliknya valid; tidak ada akun izin yang diperlukan.
* `1`: `Initialize`, `InitializeV2`, dan `InitializeWithToken2022` harus menyertakan `PlatformAllowConfig` yang cocok di mana saja di `remaining_accounts`.

Admin platform membuat atau menutup PDA dengan `CreatePlatformAllowConfig` dan `ClosePlatformAllowConfig`. Seed-nya adalah `[b"platform_allow_config", platform_config, global_config]`. Instruksi `PlatformGlobalAccess` yang dikelola admin sebelumnya dan PDA pensiun.

## Aturan parameter peluncuran platform

Empat instruksi mengelola satu akun `PlatformCurveRule`. Keempat ditandatangani oleh `PlatformConfig.curve_rule_manager` atau oleh admin platform — program menerima admin dengan menurunkan ulang PDA `PlatformConfig` dari penandatangan, jadi tidak ada akun terpisah yang membuktikannya. Penandatangan yang bukan keduanya mengembalikan `InvalidCurveRuleAuthority`.

| Instruksi | Akun | Argumen |
| - | - | - |
| `CreatePlatformCurveRule` | `curve_rule_authority` (penandatangan, mut), `platform_config`, `global_config`, `platform_curve_rule` (mut), `system_program` | tidak ada |
| `UpdatePlatformCurveRule` | lima yang sama | `group_id: u16`, `constraints: Vec<ParamConstraint>` |
| `RemovePlatformCurveRule` | lima yang sama | `group_id: u16` |
| `ClosePlatformCurveRule` | empat yang pertama | tidak ada |

`platform_curve_rule` adalah PDA di `[b"platform_curve_rule", platform_config, global_config]`.

* **`Create`** mengalokasikan akun yang tidak menyimpan grup. Status itu tidak membatasi apa pun.
* **`Update`** upsert grup dengan `group_id` itu, menggantinya sepenuhnya jika ada. Itu mengubah ukuran akun agar sesuai, jadi penandatangan menambah sewa yang tumbuh dan menerima kembali sewa yang menyusut. Grup baru di luar kesepuluh mengembalikan `CurveRuleGroupsExceeded`; lebih dari 25 batasan, bidang yang tidak dikenal atau operator, atau pasangan `(field, op)` yang sama dua kali dalam satu grup mengembalikan `InvalidCurveRuleConstraint`; empat bidang yang diturunkan `TotalSellA` pada konfigurasi non-constant-product mengembalikan `CurveRuleFieldNotSupportedByCurve`.
* **`Remove`** menjatuhkan satu grup berdasarkan id, menyusutkan akun dan mengembalikan perbedaannya. Id yang tidak dikenal mengembalikan `CurveRuleGroupNotExist`.
* **`Close`** mengembalikan seluruh sewa ke penandatangan. Konfigurasi kemudian tidak dibatasi lagi bahkan sementara `restrict_curve_param` tetap `1`.

Tidak ada dari keempat yang mengubah apakah aturan ditegakkan. Itu adalah `UpdatePlatformConfig::RestrictCurveParam(0 | 1)`, yang hanya dapat dipanggil admin platform.

**Di jalur peluncuran.** Sementara `restrict_curve_param` adalah `1`, `InitializeV2` dan `InitializeWithToken2022` memerlukan PDA aturan di `remaining_accounts` — termasuk ketika itu tidak ada, sehingga menghilangkannya tidak dapat melewati pemeriksaan. Akun yang hilang adalah `NotEnoughRemainingAccounts`; peluncuran yang tidak memenuhi grup apa pun adalah `CurveParamNotMatchPlatformRule`. Pemeriksaan berjalan sebelum batas `GlobalConfig` sendiri dan hanya dapat mempersempit mereka. Model dan playbook: [`products/launchlab/curve-rules`](/id/products/launchlab/curve-rules). Kedua kesalahan dapat dihindari sisi klien — SDK mencerminkan pemeriksaan ini sebagai fungsi murni, lihat [Periksa sebelum Anda mengirim](/id/products/launchlab/curve-rules#check-before-you-send).

## `CollectFee`

Sapuan admin biaya perdagangan yang terkumpul protokol pada satu peluncuran.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `protocol_fee_owner` | | S | Harus sama dengan `global_config.protocol_fee_owner`. |
| 2 | `authority` | | | PDA `[b"vault_auth_seed"]`; menandatangani transfer vault. |
| 3 | `pool_state` | W | | Dimutasi untuk menolkan `quote_protocol_fee`. |
| 4 | `global_config` | | | Sumber kebenaran untuk penandatangan. |
| 5 | `quote_vault` | W | | Dikuras sebesar `quote_protocol_fee`. |
| 6 | `quote_mint` | | | |
| 7 | `recipient_token_account` | W | | ATA dari `protocol_fee_owner` pada `quote_mint`. |
| 8 | `token_program` | | | Program yang memiliki quote mint — SPL Token atau Token-2022. |

<Warning>
  `quote_mint` di sini berada **sebelum** `recipient_token_account` — kebalikan dari
  `ClaimCreatorFee`, `ClaimPlatformFee` dan `ClaimPlatformFeeFromVault`, yang semuanya menempatkan
  penerima lebih dulu. Kedua slot memiliki tipe Anchor yang berbeda (`Mint` vs `TokenAccount`),
  sehingga menukarnya menyebabkan kegagalan deserialisasi saat runtime dan terlihat seperti bug
  akun yang salah. `CollectMigrateFee` memiliki urutan yang sama dengan `CollectFee`.
</Warning>

**Efek** — transfer `pool_state.quote_protocol_fee` dari `quote_vault` ke `recipient_token_account`, kemudian nolkan penghitung. Dapat dipanggil kapan saja setelah pembelian pertama.

## `CollectMigrateFee`

Sapuan admin biaya migrasi yang terkumpul pada kelulusan. Bentuk akun yang sama seperti `CollectFee` dengan `migrate_fee_owner` sebagai penandatangan (bukan `protocol_fee_owner`) dan `pool_state.migrate_fee` sebagai penghitung yang dikuras.

## `ClaimCreatorFee`

Sapuan per-pembuat biaya pembuat yang terkumpul di **setiap peluncuran yang dimiliki pembuat** yang menggunakan mint kutipan yang sama. Menguras vault biaya per-pembuat, bukan per-pool.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `creator` | W | S | Pembuat pool. |
| 2 | `fee_vault_authority` | | | PDA `[b"creator_fee_vault_auth_seed"]`. |
| 3 | `creator_fee_vault` | W | | PDA di seed `[creator, quote_mint]`; vault pembuat yang diagregasi. |
| 4 | `recipient_token_account` | W | | `init_if_needed`; ATA dari `creator` pada `quote_mint`. |
| 5 | `quote_mint` | | | |
| 6 | `token_program` | | | |
| 7 | `system_program` | | | Untuk pembuatan ATA jika diperlukan. |
| 8 | `associated_token_program` | | | |

**Efek** — transfer seluruh saldo `creator_fee_vault` ke `recipient_token_account`. Kembali dengan pemeriksaan require-greater-than-zero jika vault kosong.

## `ClaimPlatformFee`

Sapuan per-platform yang menguras vault kutipan peluncuran secara langsung. Gunakan ini ketika platform ingin mengklaim potongannya untuk satu peluncuran spesifik tanpa melalui vault platform yang diagregasi.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `platform_fee_wallet` | W | S | Harus sama dengan `platform_config.platform_fee_wallet`. |
| 2 | `authority` | | | PDA `[b"vault_auth_seed"]`. |
| 3 | `pool_state` | W | | Dikuras oleh `pool_state.platform_fee`. |
| 4 | `platform_config` | | | Sumber kebenaran untuk penandatangan. |
| 5 | `quote_vault` | W | | Dikuras. |
| 6 | `recipient_token_account` | W | | `init_if_needed`; ATA dari `platform_fee_wallet`. |
| 7 | `quote_mint` | | | |
| 8 | `token_program` | | | |
| 9 | `system_program` | | | |
| 10 | `associated_token_program` | | | |

**Efek** — transfer `pool_state.platform_fee` dari `quote_vault` ke `recipient_token_account`, nolkan penghitung.

## `ClaimPlatformFeeFromVault`

Sapuan agregat per-platform. Menguras vault biaya per-quote-mint platform yang mengumpulkan biaya dari setiap peluncuran yang dirutekan melalui platform.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `platform_fee_wallet` | W | S | Harus sama dengan `platform_config.platform_fee_wallet`. |
| 2 | `fee_vault_authority` | | | PDA `[b"platform_fee_vault_auth_seed"]`. |
| 3 | `platform_config` | | | |
| 4 | `platform_fee_vault` | W | | PDA di seed `[platform_config, quote_mint]`. |
| 5 | `recipient_token_account` | W | | `init_if_needed`; ATA dari `platform_fee_wallet`. |
| 6 | `quote_mint` | | | |
| 7 | `token_program` | | | |
| 8 | `system_program` | | | |
| 9 | `associated_token_program` | | | |

**Efek** — transfer saldo penuh `platform_fee_vault` ke `recipient_token_account`. Kembali jika vault kosong.

## `CollectExcessLamports`

Sapuan admin lamport yang duduk di atas minimum bebas sewa pada akun yang dikendalikan LaunchLab. Ditambahkan dalam upgrade 2026-09 sehingga protokol dapat mengklaim over-funding yang [pengurangan sewa SIMD-0437](/id/solana-fundamentals/rent-and-reclaimable-rent) tinggalkan di akun yang dibuat sebelum setiap langkah.

Hanya kelebihan yang bergerak. Saldo token, data akun, pemilik, status kurva dan vesting tidak tersentuh, dan instruksi adalah no-op terhadap akun yang sudah di minimum — jadi aman untuk dijalankan kembali setelah setiap peluncuran.

**Argumen** — tidak ada.

**Akun**

| # | Nama | W | S | Catatan |
| - | - | - | - | - |
| 1 | `collect_lamports_wallet` | W | S | Tujuan untuk setiap lamport yang disapu. Harus menjadi admin program LaunchLab atau dompet collect-lamports khusus — lihat [`reference/program-addresses`](/id/reference/program-addresses#excess-lamports-collection-wallets). Penandatangan lain gagal dengan `InvalidOwner` (`6001`). |
| 2 | `authority` | | | **Satu** dari tiga PDA otoritas vault LaunchLab (lihat di bawah). Menandatangani CPI program token untuk setiap akun token dalam panggilan ini. |
| 3 | `token_program` | | | SPL Token. |
| 4 | `token_program_2022` | | | Token-2022. Keduanya diperlukan tanpa syarat; program memilih per akun sumber. |
| 5.. | `remaining_accounts` | W | | `M` akun sumber untuk disapu, jumlah berapa pun, urutan apa pun. |

**Memilih `authority`**

Akun dilewatkan tanpa pemeriksaan dan diselesaikan oleh program, yang menurunkan ulang ketiga PDA otoritas LaunchLab dan cocok:

| Seed | Memiliki |
| - | - |
| `[b"vault_auth_seed"]` | Setiap vault pool dasar dan kutipan peluncuran |
| `[b"platform_fee_vault_auth_seed"]` | Setiap vault biaya platform |
| `[b"creator_fee_vault_auth_seed"]` | Setiap vault biaya pembuat |

Kunci yang tidak cocok dengan salah satu dari ketiga gagal seluruh instruksi dengan `InvalidOwner` (`6001`).

<Warning>
  **Kelompokkan akun sumber Anda berdasarkan otoritas.** Satu panggilan membawa satu `authority`, dan program token memerlukan pemilik akun yang sebenarnya untuk menandatangani. Akun token yang dimiliki oleh salah satu dari tiga PDA yang berbeda dari `authority` yang Anda lewatkan membuat CPI gagal dan membawa seluruh transaksi dengannya. Sapukan vault pool, vault biaya platform dan vault biaya pembuat dalam transaksi terpisah.

  PDA milik program adalah pengecualian — mereka didebit langsung, jadi mereka dapat naik dengan otoritas apa pun.
</Warning>

**Bagaimana setiap akun sumber ditangani**

| Pemilik akun sumber | Penanganan |
| - | - |
| SPL Token atau Token-2022, akun token non-native | CPI `WithdrawExcessLamports` (diskriminan program token `38`), ditandatangani oleh `authority`. |
| SPL Token atau Token-2022, akun **native** (wSOL) | `WithdrawExcessLamports` menolak akun native. Program CPI `SyncNative`, mengukur berapa banyak `amount` yang dibungkus tumbuh, `UnwrapLamports` (diskriminan `45`) untuk delta itu persis, kemudian memerlukan saldo yang dibungkus sama dengan nilai pra-sinknya — sebaliknya `LamportsCalculateError` (`6031`). Peluncuran yang dikutip SOL oleh karena itu menyimpan cadangan kutipan penuhnya. |
| Program LaunchLab itu sendiri — `PoolState`, `GlobalConfig`, `PlatformConfig`, `VestingRecord`, `PlatformCurveRule`, `PlatformAllowConfig` | Program mendebit akun langsung ke `rent.minimum_balance(data_len)`. |
| Apa pun yang lain | **Dilewati diam-diam.** Tidak ada kesalahan, tidak ada lamport yang bergerak. |

**Mint dasar tidak dapat disapu.** `InitializeV2` dan `InitializeWithToken2022` mencabut `MintTokens` pada mint dasar dalam instruksi yang sama yang mencetak pasokan, jadi tidak ada kunci yang dapat menandatangani `WithdrawExcessLamports` untuk itu — sewa mint tetap di mana itu selamanya.

**Kesalahan umum** — `InvalidOwner` (`6001`, penandatangan salah atau `authority` yang bukan salah satu dari tiga PDA), `LamportsCalculateError` (`6031`, putaran wSOL tidak netto ke nol), dan `InsufficientFunds` dari jalur milik program ketika akun menyimpan kurang dari minimum sewa sendirinya.

**Tidak ada pembangun SDK.** `@raydium-io/raydium-sdk-v2` tidak mengirimkan pembangun untuk instruksi ini, dan juga tidak `raydium-sdk-V2-demo` repo — itu adalah jalur admin. Enkode dengan tangan, cara sapuan sisi dompet di [`solana-fundamentals/rent-and-reclaimable-rent`](/id/solana-fundamentals/rent-and-reclaimable-rent#building-the-instruction) lakukan untuk instruksi program token.

## Instruksi vesting dan platform-config

Ini didokumentasikan di halaman khusus karena masing-masing memiliki model status sendiri:

* [`CreateVestingAccount`, `CreatePlatformVestingAccount`, `ClaimVestedToken`](/id/products/launchlab/vesting)
* [`CreatePlatformConfig`, `UpdatePlatformConfig`, `CreatePlatformAllowConfig`, `ClosePlatformAllowConfig`](/id/products/launchlab/platform-config)
* [`CreatePlatformCurveRule`, `UpdatePlatformCurveRule`, `RemovePlatformCurveRule`, `ClosePlatformCurveRule`](/id/products/launchlab/curve-rules)
* [`CreateConfig`, `UpdateConfig`](/id/products/launchlab/global-config)

## Matriks perubahan status

| Instruksi | `status` | `real_base` | `real_quote` | Penghitung biaya | Pool status-pasca |
| - | - | - | - | - | - |
| `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 | (sama) | — |
| Ambang tercapai | → Migrate | — | — | — | — |
| `MigrateToCpswap` / `MigrateToAmm` warisan | → Migrated | (beku) | (beku) | `migrate_fee` diatur | dibuat; LP CPMM dibagi menjadi kunci platform dan bakar |
| `CollectExcessLamports` | — | — | — | — | — |
| `CollectFee` / `CollectMigrateFee` | apa pun | — | — | penghitung dinolkan | — |
| `ClaimCreatorFee` / `ClaimPlatformFee*` | apa pun | — | — | menguras vault | — |
| `CreateVestingAccount` | Funding | — | — | — | bumps `allocated_share_amount` |
| `ClaimVestedToken` | Migrated | — | — | — | menguras `base_vault` |

## Ke mana selanjutnya

* [`products/launchlab/code-demos`](/id/products/launchlab/code-demos) — contoh TypeScript untuk setiap instruksi.
* [`products/launchlab/accounts`](/id/products/launchlab/accounts) — bentuk status penuh.
* [`reference/error-codes`](/id/reference/error-codes) — enum kesalahan LaunchLab.

Sumber:

* [Modul Raydium SDK v2 `LaunchLab`](https://github.com/raydium-io/raydium-sdk-V2)
* Sumber program Raydium LaunchLab


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.