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

> Konfigurasi per-platform yang menyesuaikan branding, pembagian biaya, berbagi migrasi NFT, alokasi vesting, dan daftar putih bentuk kurva yang diizinkan untuk setiap peluncuran yang dirutekan melalui platform tersebut.

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

  [Lihat versi bahasa Inggris →](/products/launchlab/platform-config)
</Info>

<Info>
  `PlatformConfig` adalah lapisan overlay **tingkat platform** yang berada di atas [`GlobalConfig`](/id/products/launchlab/global-config). Di mana `GlobalConfig` mendefinisikan aturan-aturan protokol yang berlaku luas ("biaya perdagangan adalah 1%, pasokan harus minimal 10M, hanya dompet ini yang dapat lulus"), `PlatformConfig` adalah yang digunakan setiap platform peluncuran — pump.fun, UI Raydium sendiri, launchpad pihak ketiga — untuk menambahkan biaya mereka, mengklaim bagian mereka dari LP pasca-kelulusan, membatasi bentuk kurva mana yang dapat dipilih peluncuran mereka, dan menampilkan branding mereka (nama, situs web, gambar) di rantai.
</Info>

## Apa itu

Akun `PlatformConfig` menguasai empat kepentingan lintas-platform:

1. **Branding** — nama, situs web, tautan gambar, semuanya disimpan dalam baris sehingga penjelajah atau agregator apa pun dapat menampilkan platform yang meluncurkan token.
2. **Biaya platform** — biaya perdagangan tambahan (`fee_rate`) di atas `trade_fee_rate` protokol. Terakumulasi ke `platform_fee_wallet` platform. Dibatasi pada 100 bps oleh `GlobalConfig.max_share_fee_rate`.
3. **Pembagian migrasi NFT** — tiga bilangan bulat (`platform_scale`, `creator_scale`, `burn_scale`) yang berjumlah `RATE_DENOMINATOR_VALUE = 1_000_000` dan mempartisi LP pasca-kelulusan menjadi potongan yang dicetak ke dompet NFT platform, potongan ke dompet NFT kreator, dan potongan yang dibakar (Burn & Earn). Hanya bermakna ketika kelulusan menargetkan CPMM (`migrate_type = 1`).
4. **Daftar putih parameter kurva** — `Vec<PlatformCurveParam>` yang mencantumkan kombinasi `(supply, total_base_sell, total_quote_fund_raising, migrate_type, migrate_cpmm_fee_on, vesting_params...)` mana yang diizinkan pada platform ini. Jika vektor kosong atau semua entri tidak valid, **setiap** kombinasi diizinkan; jika tidak, peluncuran harus cocok dengan satu entri tepat.

Derivasi PDA:

```ts theme={null}
const [platformConfigPda] = PublicKey.findProgramAddressSync(
  [
    Buffer.from("platform_config"),
    platformAdmin.toBuffer(),       // platform's owning pubkey
  ],
  LAUNCHLAB_PROGRAM_ID,
);
```

(Lihat `create_platform_config` dalam sumber untuk daftar seed kanonik.)

## Tata Letak

```rust theme={null}
// states/platform_config.rs
pub const PLATFORM_CONFIG_SEED: &str = "platform_config";
pub const NAME_SIZE: usize = 64;
pub const WEB_SIZE:  usize = 256;
pub const IMG_SIZE:  usize = 256;
pub const MAX_CREATOR_FEE_RATE: u64 = 5000;       // 50 bps (denominator 1_000_000)
pub const MAX_TRANSFER_FEE_RATE: u16 = 500;       // 5%   (denominator 10_000)
pub const MAX_CURVE_PARAMS: usize = 10;

#[account]
pub struct PlatformConfig {
    pub epoch:                       u64,
    pub platform_fee_wallet:         Pubkey,            // signs ClaimPlatformFee
    pub platform_nft_wallet:         Pubkey,            // receives the platform NFT slice at CPMM graduation
    pub platform_scale:              u64,               // share of LP minted to platform NFT
    pub creator_scale:               u64,               // share of LP minted to creator NFT
    pub burn_scale:                  u64,               // share of LP burned via Burn & Earn
    pub fee_rate:                    u64,               // platform's trade fee (1/1_000_000)
    pub name:                        [u8; 64],          // utf-8 padded with zeros
    pub web:                         [u8; 256],
    pub img:                         [u8; 256],
    pub cpswap_config:               Pubkey,            // CPMM AmmConfig that the post-grad pool will bind to
    pub creator_fee_rate:            u64,               // creator-side fee taken pre-graduation
    pub transfer_fee_extension_auth: Pubkey,            // for Token-2022 launches: who inherits transfer-fee authorities post-graduation
    pub platform_vesting_wallet:     Pubkey,
    pub platform_vesting_scale:      u64,               // platform's slice of total_locked_amount
    pub platform_cp_creator:         Pubkey,            // optional creator-of-record on the post-graduation CPMM pool
    pub padding:                     [u8; 108],
    pub curve_params:                Vec<PlatformCurveParam>, // whitelist of permitted curve shapes
}
```

`platform_scale + creator_scale + burn_scale` harus sama dengan `1_000_000` (divalidasi oleh `MigrateNftInfo::check`). Pembagian umum yang terlihat dalam produksi:

* `(0, 100_000, 900_000)` — 90% LP dibakar, 10% ke kreator. Peluncuran yang adil gaya pump standar.
* `(50_000, 100_000, 850_000)` — potongan platform kecil (5%), 10% kreator, 85% bakar.
* `(0, 0, 1_000_000)` — pembakaran penuh, tanpa pencetakan NFT. Peluncuran "tanpa insider" ketat.

## Bidang Branding

`name`, `web`, dan `img` adalah larik byte dalam baris yang diisi dengan nol hingga konstanta ukuran mereka. Untuk membacanya sebagai string, iris hingga `\0` pertama:

```ts theme={null}
function readString(bytes: Uint8Array): string {
  const end = bytes.indexOf(0);
  return Buffer.from(end === -1 ? bytes : bytes.subarray(0, end)).toString("utf-8");
}
```

Konstanta sengaja murah hati (`name: 64`, `web: 256`, `img: 256`) sehingga platform dapat menyertakan metadata yang cukup untuk penjelajah dan agregator tanpa menyentuh penyimpanan di luar rantai. Apa pun yang melebihi ukuran ini kembali pada `CreatePlatformConfig` dengan `InvalidInput`.

## Mekanika Biaya

Swap pada kurva yang terikat pada `PlatformConfig` mengenakan tiga biaya berlapis:

```
trade_fee     = amount_in × global_config.trade_fee_rate    / 1_000_000
platform_fee  = amount_in × platform_config.fee_rate        / 1_000_000
creator_fee   = amount_in × platform_config.creator_fee_rate / 1_000_000

amount_after_fee = amount_in − trade_fee − platform_fee − creator_fee
```

* `trade_fee` terakumulasi ke `protocol_fee_owner` protokol (diklaim via `CollectFee`).
* `platform_fee` terakumulasi ke vault per-platform (diklaim via `ClaimPlatformFee` atau `ClaimPlatformFeeFromVault`; lihat [`instructions`](/id/products/launchlab/instructions)).
* `creator_fee` terakumulasi ke vault per-kreator yang dikunci oleh pubkey kreator + quote mint (diklaim via `ClaimCreatorFee`).

`creator_fee_rate` dibatasi oleh `MAX_CREATOR_FEE_RATE = 5000` (50 bps). `fee_rate` (biaya platform) dibatasi pada `10000` (100 bps) oleh `GlobalConfig.max_share_fee_rate`.

## Pembagian migrasi NFT (hanya CPMM)

Ketika peluncuran lulus ke CPMM (`migrate_type = 1`, ditandatangani oleh `migrate_to_cpswap_wallet`), instruksi migrasi membagi token LP yang dicetak oleh `CPMM::InitializeWithPermission` tiga cara:

```
lp_to_platform = lp_total × platform_scale / 1_000_000   → platform_nft_wallet
lp_to_creator  = lp_total × creator_scale  / 1_000_000   → creator NFT (Fee Key)
lp_to_burn     = lp_total × burn_scale     / 1_000_000   → Burn & Earn lock program
```

Potongan platform dan kreator dibungkus sebagai **NFT** oleh program LP-Lock (`LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE`) — pemegang NFT berhak untuk mengklaim biaya CPMM yang terakumulasi tanpa batas tanpa dapat menarik likuiditas yang mendasarinya. Lihat [`products/launchlab/creator-fees`](/id/products/launchlab/creator-fees) untuk alur Fee Key pasca-kelulusan.

Potongan pembakaran dikirim ke program Lock dengan `is_burn = true` sehingga token LP selamanya tidak dapat diakses — mereka mengamankan lantai harga pool tanpa pernah membayar biaya kembali kepada siapa pun.

Ketika `migrate_type = 0` (lulus ke AMM v4), bidang pembagian NFT diabaikan dan seluruh LP dikunci / dibakar sesuai dengan alur AMM v4-side terpisah.

## Daftar putih parameter kurva

`curve_params: Vec<PlatformCurveParam>` adalah mekanisme platform untuk membatasi bentuk kurva apa yang dapat dipilih peluncurannya. Jika vektor tidak kosong dan setidaknya satu entri valid, program memberlakukan pada `Initialize` bahwa parameter peluncuran cocok dengan setidaknya satu entri tepat.

```rust theme={null}
#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct PlatformCurveParam {
    pub epoch:                u64,
    pub index:                u8,           // ordinal within this platform's whitelist
    pub global_config:        Pubkey,       // which GlobalConfig this entry applies to
    pub bonding_curve_param:  BondingCurveParam,
    pub padding:              [u64; 50],
}

#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct BondingCurveParam {
    pub migrate_type:               u8,    // 0 = AMM v4, 1 = CPMM. u8::MAX = wildcard
    pub migrate_cpmm_fee_on:        u8,    // 0 = quote-only, 1 = both. u8::MAX = wildcard
    pub supply:                     u64,   // 0 = wildcard
    pub total_base_sell:            u64,   // 0 = wildcard
    pub total_quote_fund_raising:   u64,   // 0 = wildcard
    pub total_locked_amount:        u64,   // u64::MAX = wildcard
    pub cliff_period:               u64,   // u64::MAX = wildcard
    pub unlock_period:              u64,   // u64::MAX = wildcard
}
```

Setiap bidang memiliki nilai sentinal yang berarti **wildcard** (nilai apa pun cocok): `u64::MAX` untuk bidang `u64`, `u8::MAX` untuk bidang `u8`, `0` untuk bidang pasokan / jual / penggalangan dana. `BondingCurveParam` dengan semua sentinal adalah "izinkan apa pun" — setara dengan perilaku daftar putih kosong.

Algoritma pencocokan pada `Initialize`:

1. Filter `curve_params` ke entri yang `global_config` cocok dengan `GlobalConfig` pilihan peluncuran.
2. Jika daftar yang disaring kosong, izinkan parameter apa pun (platform tidak memasukkan apa pun ke dalam daftar putih untuk `GlobalConfig` ini).
3. Jika setiap entri dalam daftar yang disaring memiliki `all_is_invalid()` (setiap bidang adalah wildcard), izinkan parameter apa pun.
4. Sebaliknya, ulangi entri; untuk setiap entri, periksa parameter peluncuran terhadap setiap bidang non-wildcard. Jika semua bidang non-wildcard cocok, terima dan kembali.
5. Jika tidak ada entri yang cocok, kembali dengan `InvalidInput`.

Ini memungkinkan platform untuk mengatakan "kami hanya mengizinkan bentuk 1B-pasokan / 800M-dijual / 30k-USDC-kumpulan / tidak-vesting standar" dengan menulis satu entri dengan nilai konkret untuk empat bidang itu dan wildcard di tempat lain. Atau platform yang lebih ketat mungkin menghitung tiga atau empat bentuk diskrit, satu per tingkat peluncuran yang didukung.

`MAX_CURVE_PARAMS = 10` membatasi ukuran daftar putih.

## `PlatformGlobalAccess` — mengotorisasi platform

Ketika `GlobalConfig` memiliki `requires_platform_auth = 1`, setiap `Initialize` terhadapnya harus menyertakan `PlatformGlobalAccess` PDA yang membuktikan platform telah diotorisasi sebelumnya:

```rust theme={null}
// states/platform_global_access.rs
pub const PLATFORM_GLOBAL_ACCESS_SEED: &str = "platform_global_access";

#[account]
pub struct PlatformGlobalAccess {
    pub bump:            u8,
    pub global_config:   Pubkey,
    pub platform_config: Pubkey,
    pub padding:         [u64; 8],
}
```

Seed PDA: `[b"platform_global_access", global_config, platform_config]`.

Admin protokol membuat satu ini per pasang `(GlobalConfig, PlatformConfig)` melalui `CreatePlatformGlobalAccess` dan membatalkannya melalui `ClosePlatformGlobalAccess`. Tanpa akun ini, peluncuran tidak dapat mengikat ke `GlobalConfig` itu dari platform yang gated.

## Jalur baca

```ts theme={null}
const platformConfig = await raydium.launchpad.getPlatformConfig(platformConfigPda);

console.log("Platform:", readString(platformConfig.name));
console.log("Fee rate:", platformConfig.feeRate, "(/1M)");
console.log("NFT split:",
  platformConfig.platformScale,
  platformConfig.creatorScale,
  platformConfig.burnScale,
);
console.log("Curve whitelist size:", platformConfig.curveParams.length);
```

Untuk UI yang menunjukkan "di mana token ini diluncurkan", `PoolState.platform_config` menunjuk langsung ke `PlatformConfig` asal — ambil sekali dan cache branding-nya.

## Jalur pembaruan

| Instruksi                   | Siapa menandatangani          | Apa yang berubah                                                                                                                                                                               |
| --------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CreatePlatformConfig`      | admin platform (sekali waktu) | Menginisialisasi akun dengan `PlatformParams`.                                                                                                                                                 |
| `UpdatePlatformConfig`      | admin platform                | Pengiriman generik yang dikunci dengan `param: u8`; mengubah satu bidang per panggilan. Bidang branding, tingkat biaya, dompet vesting, dan berbagai dompet semuanya dapat diatur melalui ini. |
| `UpdatePlatformCurveParam`  | admin platform                | Tambah atau ganti satu entri `PlatformCurveParam` dengan `(global_config, index)`.                                                                                                             |
| `RemovePlatformCurveParam`  | admin platform                | Hapus satu entri (atur ke all-sentinel = wildcard).                                                                                                                                            |
| `ClaimPlatformFee`          | `platform_fee_wallet`         | Sapu biaya platform per-pool dari `PoolState.quote_vault`.                                                                                                                                     |
| `ClaimPlatformFeeFromVault` | `platform_fee_wallet`         | Sapu vault biaya per-platform (PDA di `[platform_config, quote_mint]`).                                                                                                                        |

Rotasi dompet (`platform_fee_wallet`, `platform_nft_wallet`, `platform_vesting_wallet`, `platform_cp_creator`, `transfer_fee_extension_auth`, `cpswap_config`) semuanya melalui `UpdatePlatformConfig`. Baca tabel pengiriman `update_platform_config` sumber untuk kode `param` yang tepat.

## Jebakan umum

* **Sentinal daftar putih salah atur.** `BondingCurveParam` dengan `total_locked_amount = 0` *bukan* wildcard — cocok dengan peluncuran yang secara eksplisit menolak vesting. Wildcard untuk bidang itu adalah `u64::MAX`. Perangkap yang sama ada untuk `cliff_period` dan `unlock_period`. Gunakan `clear()` (yang program keluarkan) untuk mengatur sentinal dengan benar.
* **Pembulatan pembagian NFT.** Tiga skala harus berjumlah persis `1_000_000`. Kesalahan off-by-one di `CreatePlatformConfig` kembali; off-by-one saat runtime akan mencetak atau membakar satu unit LP ekstra, yang itulah pemeriksaan kesetaraan ketat di sana untuk mencegah.
* **Alokasi ganda vesting platform.** Jika `platform_vesting_scale > 0`, platform harus memanggil `CreatePlatformVestingAccount` sekali setelah penggalangan dana peluncuran berakhir; jika lupa, bagian itu tetap tidak dialokasikan dan tidak aktif selamanya (anggaran `total_locked_amount` peluncuran dikonsumsi tetapi platform tidak pernah mengklaim).
* **Ambiguitas `platform_cp_creator`.** Ketika diatur ke `Pubkey::default()`, kreator peluncuran dicatat sebagai `pool_creator` pool CPMM pasca-kelulusan; ketika diatur ke kunci nyata, kunci itu dicatat sebagai gantinya. Ini memengaruhi siapa yang dapat memanggil `CPMM::CollectCreatorFee` nanti. Putuskan saat pembuatan konfigurasi platform model mana yang Anda inginkan.

## Penunjuk

* [`products/launchlab/global-config`](/id/products/launchlab/global-config) — aturan sisi protokol yang harus dipenuhi peluncuran.
* [`products/launchlab/vesting`](/id/products/launchlab/vesting) — mekanika `platform_vesting_scale`.
* [`products/launchlab/creator-fees`](/id/products/launchlab/creator-fees) — NFT Fee Key, Burn & Earn.
* [`products/launchlab/platforms`](/id/products/launchlab/platforms) — panduan integrasi platform.

Sumber:

* `raydium-launch/programs/launchpad/src/states/platform_config.rs` — `PlatformConfig`, `PlatformParams`, `MigrateNftInfo`, `PlatformCurveParam`, `BondingCurveParam`, `is_valid_curve_param`.
* `raydium-launch/programs/launchpad/src/states/platform_global_access.rs` — `PlatformGlobalAccess`.
* `raydium-launch/programs/launchpad/src/lib.rs` — `create_platform_config`, `update_platform_config`, `update_platform_curve_param`, `remove_platform_curve_param`, `create_platform_global_access`, `close_platform_global_access`, `claim_platform_fee`, `claim_platform_fee_from_vault`.
