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

> プラットフォームごとの設定で、ブランディング、フィー配分、NFT マイグレーション分配、ベスティング割当、そのプラットフォームを通じてルーティングされるローンチが使用できるボンディングカーブ形状のホワイトリストをカスタマイズします。

<Info>
  **このページは AI による自動翻訳です。すべての内容は英語版を正とします。**

  [英語版を表示 →](/products/launchlab/platform-config)
</Info>

<Info>
  `PlatformConfig` は [`GlobalConfig`](/ja/products/launchlab/global-config) の上に位置する**プラットフォームレベル**のオーバーレイです。`GlobalConfig` がプロトコル全体のルール（「トレードフィーは 1%、供給量は最低 10M、このウォレットだけがグラデュエーションできる」）を定義するのに対し、`PlatformConfig` は各ローンチプラットフォーム（pump.fun、Raydium の独自 UI、サードパーティ・ラウンチパッド）がそのフィーを追加し、グラデュエーション後の LP の スライスを請求し、ローンチが使用できるボンディングカーブ形状を制限し、プラットフォームのブランディング（名前、ウェブサイト、画像）をオンチェーンで表示するために使用します。
</Info>

## 概要

`PlatformConfig` アカウントはプラットフォームの 4 つの横断的な関心事を管理します。

1. **ブランディング** — 名前、ウェブサイト、画像リンクはすべてインラインで保存されるため、任意のエクスプローラーまたはアグリゲーターがトークンをローンチしたプラットフォームを表示できます。
2. **プラットフォーム フィー** — プロトコルの `trade_fee_rate` の上に追加されるトレードフィー（`fee_rate`）。プラットフォームの `platform_fee_wallet` に蓄積されます。`GlobalConfig.max_share_fee_rate` により 100 bps に上限が設定されています。
3. **NFT マイグレーション分配** — 3 つの整数（`platform_scale`、`creator_scale`、`burn_scale`）が `RATE_DENOMINATOR_VALUE = 1_000_000` に合計され、グラデュエーション後の LP をプラットフォーム NFT ウォレットにミントされるピース、クリエーター NFT ウォレットへのピース、バーン（Burn & Earn）されるピースに分割します。グラデュエーション対象が CPMM（`migrate_type = 1`）の場合にのみ意味があります。
4. **ボンディングカーブパラメータ ホワイトリスト** — 許可される `(supply, total_base_sell, total_quote_fund_raising, migrate_type, migrate_cpmm_fee_on, vesting_params...)` の組み合わせをリストアップする `Vec<PlatformCurveParam>`。ベクトルが空であるか、すべてのエントリが無効である場合、**任意の**組み合わせが許可されます。そうでなければ、ローンチはエントリのいずれかと正確に一致する必要があります。

PDA の派生：

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

（カノニカルなシードリストについては、ソースの `create_platform_config` を参照してください。）

## レイアウト

```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` は `1_000_000` に等しい必要があります（`MigrateNftInfo::check` で検証）。本番環境で見られる一般的な分配：

* `(0, 100_000, 900_000)` — 90% LP がバーン、10% がクリエーターへ。標準的な pump スタイルのフェア・ローンチ。
* `(50_000, 100_000, 850_000)` — 小さなプラットフォーム スライス（5%）、10% クリエーター、85% バーン。
* `(0, 0, 1_000_000)` — 完全バーン、NFT ミントなし。厳密な「インサイダーなし」ローンチ。

## ブランディング フィールド

`name`、`web`、`img` はインラインのバイト配列で、それぞれのサイズ定数までゼロでパディングされています。文字列として読み込むには、最初の `\0` までをスライスします。

```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");
}
```

定数は意図的に余裕を持たせてあり（`name: 64`、`web: 256`、`img: 256`）、プラットフォームがオフチェーン ストレージに触れることなく、エクスプローラーとアグリゲーターに十分なメタデータを含めることができるようにしています。これらのサイズを超えるものは `CreatePlatformConfig` で `InvalidInput` でリバートします。

## フィー メカニクス

`PlatformConfig` にバインドされたカーブでのスワップは 3 層のフィーを課金します。

```
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` はプロトコルの `protocol_fee_owner` に蓄積されます（`CollectFee` を介して請求）。
* `platform_fee` はプラットフォーム単位のボールトに蓄積されます（`ClaimPlatformFee` または `ClaimPlatformFeeFromVault` を介して請求。[`instructions`](/ja/products/launchlab/instructions) を参照）。
* `creator_fee` はクリエーターの pubkey + quote mint でキー付けされたクリエーター単位のボールトに蓄積されます（`ClaimCreatorFee` を介して請求）。

`creator_fee_rate` は `MAX_CREATOR_FEE_RATE = 5000`（50 bps）で上限が設定されています。`fee_rate`（プラットフォーム フィー）は `GlobalConfig.max_share_fee_rate` により `10000`（100 bps）に上限が設定されています。

## NFT マイグレーション分配（CPMM のみ）

ローンチが CPMM にグラデュエーションするとき（`migrate_type = 1`、`migrate_to_cpswap_wallet` によって署名）、マイグレーション命令は `CPMM::InitializeWithPermission` によってミントされた LP トークンを 3 つの方法で分割します。

```
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
```

プラットフォームとクリエーターのスライスは LP-Lock プログラム（`LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE`）によって **NFT** としてラップされます。NFT の保有者は、基礎となるリクイディティを引き出すことができずに、蓄積された CPMM フィーを無期限に請求する権利があります。グラデュエーション後の Fee Key フローについては、[`products/launchlab/creator-fees`](/ja/products/launchlab/creator-fees) を参照してください。

バーン スライスは `is_burn = true` で Lock プログラムに送信されるため、LP トークンは永久にアクセス不可になります。プールの価格下限を保護しますが、誰にもフィーを払い戻すことはありません。

`migrate_type = 0`（AMM v4 にグラデュエーション）の場合、NFT 分配フィールドは無視され、LP 全体は別の AMM v4 サイドフロー に従ってロック/バーンされます。

## ボンディングカーブ パラメータ ホワイトリスト

`curve_params: Vec<PlatformCurveParam>` はプラットフォームがそのローンチが使用できるボンディングカーブ形状を制限するメカニズムです。ベクトルが空でなく、少なくとも 1 つのエントリが有効である場合、プログラムは `Initialize` でローンチのパラメータが少なくとも 1 つのエントリと正確に一致することを強制します。

```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
}
```

各フィールドには**ワイルドカード**を意味するセンチネル値があります（任意の値と一致）。`u64` フィールドの場合は `u64::MAX`、`u8` フィールドの場合は `u8::MAX`、supply/sell/fundraising フィールドの場合は `0`。すべてのセンチネルを持つ `BondingCurveParam` は「すべてを許可」です。これは空のホワイトリスト動作と同等です。

`Initialize` でのマッチング アルゴリズム：

1. `curve_params` をローンチが選択した `GlobalConfig` と一致するエントリにフィルタリングします。
2. フィルタリングされたリストが空の場合、任意のパラメータを許可します（プラットフォームはこの `GlobalConfig` に対して何もホワイトリストに登録していません）。
3. フィルタリングされたリスト内のすべてのエントリが `all_is_invalid()`（すべてのフィールドがワイルドカード）である場合、任意のパラメータを許可します。
4. そうでなければ、エントリを繰り返します。各エントリについて、ローンチのパラメータをすべての非ワイルドカード フィールドに対してチェックします。すべての非ワイルドカード フィールドが一致する場合、受け入れて返します。
5. エントリが一致しない場合、`InvalidInput` でリバートします。

これにより、プラットフォームは「標準的な 1B サプライ/800M 売却/30k USDC レイズ/ベスティングなし形状のみを許可」と言うことができます。それらの 4 つのフィールドに具体的な値を記述し、他の場所にはワイルドカードを記述します。または、より厳密なプラットフォームは 3 つまたは 4 つの個別の形状を列挙できます。1 つはサポートされているローンチ レベルごとです。

`MAX_CURVE_PARAMS = 10` はホワイトリスト サイズを上限設定します。

## `PlatformGlobalAccess` — プラットフォームの認可

`GlobalConfig` が `requires_platform_auth = 1` を持つ場合、それに対する各 `Initialize` はプラットフォームが事前認可されていることを証明する `PlatformGlobalAccess` PDA を含める必要があります。

```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],
}
```

PDA シード：`[b"platform_global_access", global_config, platform_config]`。

プロトコル管理者は `CreatePlatformGlobalAccess` を介して `(GlobalConfig, PlatformConfig)` ペアごとに 1 つを作成し、`ClosePlatformGlobalAccess` を介して失効させます。このアカウントがないと、ローンチはゲーティングされたプラットフォームからその `GlobalConfig` にバインドできません。

## 読み取りパス

```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);
```

「このトークンはどこからローンチされたか」を示す UI の場合、`PoolState.platform_config` は元の `PlatformConfig` を直接指します。一度取得してブランディングをキャッシュしてください。

## 更新パス

| 命令                          | 署名者                   | 変更内容                                                                                                          |
| --------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------- |
| `CreatePlatformConfig`      | プラットフォーム管理者（1 回限り）    | `PlatformParams` でアカウントを初期化します。                                                                               |
| `UpdatePlatformConfig`      | プラットフォーム管理者           | 汎用ディスパッチ（`param: u8` でキー付け）。呼び出しごとに 1 つのフィールドを変更します。ブランディング フィールド、フィー率、ベスティング ウォレット、様々なウォレットはすべてこれを通じて設定可能です。 |
| `UpdatePlatformCurveParam`  | プラットフォーム管理者           | `(global_config, index)` により 1 つの `PlatformCurveParam` エントリを追加または置換します。                                       |
| `RemovePlatformCurveParam`  | プラットフォーム管理者           | 1 つのエントリをクリアします（すべてのセンチネル = ワイルドカードに設定）。                                                                      |
| `ClaimPlatformFee`          | `platform_fee_wallet` | `PoolState.quote_vault` からプール単位のプラットフォーム フィーをスイープします。                                                         |
| `ClaimPlatformFeeFromVault` | `platform_fee_wallet` | プラットフォーム単位のフィー ボールト（`[platform_config, quote_mint]` の PDA）をスイープします。                                           |

ウォレット ローテーション（`platform_fee_wallet`、`platform_nft_wallet`、`platform_vesting_wallet`、`platform_cp_creator`、`transfer_fee_extension_auth`、`cpswap_config`）はすべて `UpdatePlatformConfig` を通じて実行されます。正確な `param` コードについては、ソースの `update_platform_config` ディスパッチ テーブルを参照してください。

## よくある落とし穴

* **ホワイトリスト センチネルの誤設定。** `total_locked_amount = 0` を持つ `BondingCurveParam` はワイルドカード*ではなく*、ベスティングを明示的にオプトアウトするローンチと一致します。そのフィールドのワイルドカードは `u64::MAX` です。同じトラップが `cliff_period` と `unlock_period` にも存在します。`clear()`（プログラムが公開しているもの）を使用してセンチネルを正しく設定します。
* **NFT 分配のラウンディング。** 3 つのスケールは正確に `1_000_000` に合計される必要があります。`CreatePlatformConfig` での 1 の誤差はリバートします。実行時での 1 の誤差は 1 つ追加の LP ユニットをミントまたはバーンするでしょう。これは厳密な等式チェックが防ぐべきものです。
* **プラットフォーム ベスティング二重割当。** `platform_vesting_scale > 0` の場合、プラットフォームはローンチの fundraising が終了した後に 1 回 `CreatePlatformVestingAccount` を呼び出す必要があります。忘れた場合、そのシェアは未割当と休止状態で永遠に残ります（ローンチの `total_locked_amount` バジェットは消費されますが、プラットフォームは決して請求しません）。
* **`platform_cp_creator` の曖昧さ。** `Pubkey::default()` に設定された場合、ローンチ クリエーターがグラデュエーション後の CPMM プールの `pool_creator` として記録されます。実際のキーに設定された場合、そのキーが代わりに記録されます。これは後で `CPMM::CollectCreatorFee` を呼び出せるユーザーに影響します。プラットフォーム設定作成時にどのモデルが必要かを決定してください。

## ポインタ

* [`products/launchlab/global-config`](/ja/products/launchlab/global-config) — ローンチが満たさなければならないプロトコル側のルール。
* [`products/launchlab/vesting`](/ja/products/launchlab/vesting) — `platform_vesting_scale` メカニクス。
* [`products/launchlab/creator-fees`](/ja/products/launchlab/creator-fees) — Fee Key NFT、Burn & Earn。
* [`products/launchlab/platforms`](/ja/products/launchlab/platforms) — プラットフォーム インテグレーター向けハウツー。

ソース：

* `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`。
