# Creating a platform

トークンのローンチを有効にするために、LaunchLab プラットフォームを作成して設定します。

ユーザーがあなたのプラットフォームでトークンをローンチできるようにする前に、プラットフォーム設定を作成する必要があります。各ウォレットは 1 つのプラットフォームしか作成できません。

***

## プラットフォームの作成

使用します `createPlatformConfig()` を使用して、手数料構成、LP 配分設定、メタデータを含むプラットフォームを初期化します。

```typescript
import {
  TxVersion,
  LAUNCHPAD_PROGRAM,
  DEVNET_PROGRAM_ID,
} from '@raydium-io/raydium-sdk-v2'
import { initSdk } from './config'
import { PublicKey } from '@solana/web3.js'
import BN from 'bn.js'

const createPlatform = async () => {
  const raydium = await initSdk()
  const owner = raydium.ownerPubKey

  const { execute, extInfo } = await raydium.launchpad.createPlatformConfig({
    programId: LAUNCHPAD_PROGRAM, // devnet では DEVNET_PROGRAM_ID.LAUNCHPAD_PROGRAM を使用

    // ウォレット設定
    platformAdmin: owner,
    platformClaimFeeWallet: owner,
    platformLockNftWallet: owner,
    platformVestingWallet: owner,

    // 移行済みプール向けの CPMM プール手数料ティア
    cpConfigId: new PublicKey('DNXgeM9EiiaAbaWvwjHj9fQQLAX5ZsfHyvmYUNRAdNC8'),

    // Token-2022 の transfer fee 権限（移行後に手数料権限を受け取る）
    transferFeeExtensionAuth: owner,

    // 手数料設定
    feeRate: new BN(10000),        // bonding curve の取引に対する 1% のプラットフォーム手数料
    creatorFeeRate: new BN(5000),  // bonding curve の取引に対する 0.5% の creator 手数料

    // 移行時の LP 配分（合計は 1,000,000 である必要があります）
    migrateCpLockNftScale: {
      platformScale: new BN(100000),  // プラットフォームに 10%（ロック）
      creatorScale: new BN(100000),   // creator に 10%（ロック）
      burnScale: new BN(800000),      // 80% を burn
    },

    // プラットフォームのメタデータ
    name: 'My LaunchLab',
    web: 'https://mylaunchlab.io',
    img: 'https://mylaunchlab.io/logo.png',

    txVersion: TxVersion.V0,
  })

  const { txId } = await execute({ sendAndConfirm: true })
  console.log('Platform created:', extInfo.platformId.toBase58())
}
```

***

## 設定パラメータ

### ウォレット設定

| パラメータ                    | 型         | 説明                                                              |
| ------------------------ | --------- | --------------------------------------------------------------- |
| `platformAdmin`          | PublicKey | プラットフォームを管理する管理者ウォレット。設定を更新できます。                                |
| `platformClaimFeeWallet` | PublicKey | bonding curve からプラットフォームの取引手数料を受け取るウォレット。                       |
| `platformLockNftWallet`  | PublicKey | 移行後にプラットフォームの Fee Key NFT を受け取るウォレット。                           |
| `platformVestingWallet`  | PublicKey | プラットフォームの vesting 割り当て用ウォレット。不要な場合は `PublicKey.default` を使用します。 |

### 手数料設定

| パラメータ            | 型  | 説明                                                                                      |
| ---------------- | -- | --------------------------------------------------------------------------------------- |
| `feeRate`        | BN | bonding curve の取引手数料におけるプラットフォームの割合。bps × 100 で指定します（`10000 = 1%`).                     |
| `creatorFeeRate` | BN | bonding curve の取引手数料における creator の割合。bps × 100 で指定します（`5000 = 0.5%`）。最大 `50000` (`5%`). |

手数料は quote token（例: SOL）で計算されます。各取引での総手数料 =  `protocolFeeRate` + `platformFeeRate` + `creatorFeeRate` + `shareFeeRate`。各当事者は、それぞれの比例配分を受け取ります。

### 移行時の LP 配分

| パラメータ           | 型  | 説明                                                                           |
| --------------- | -- | ---------------------------------------------------------------------------- |
| `platformScale` | BN | Burn & Earn によりロックされる LP トークンにおけるプラットフォームの割合。プラットフォームは Fee Key NFT を受け取ります。  |
| `creatorScale`  | BN | Burn & Earn によりロックされる LP トークンにおける creator の割合。creator は Fee Key NFT を受け取ります。 |
| `burnScale`     | BN | LP トークンは永久に burn されます。手数料は発生しません。                                            |

これら 3 つの値の合計は `1,000,000` (100%).

### 配分例

```typescript
// 80% を burn、10% を creator、10% をプラットフォーム
{ burnScale: 800000, creatorScale: 100000, platformScale: 100000 }

// 90% を burn、10% を creator（プラットフォーム配分なし）
{ burnScale: 900000, creatorScale: 100000, platformScale: 0 }

// 100% を burn（継続的な手数料なし）
{ burnScale: 1000000, creatorScale: 0, platformScale: 0 }
```

### プール設定

| パラメータ                      | 型         | 説明                                              |
| -------------------------- | --------- | ----------------------------------------------- |
| `cpConfigId`               | PublicKey | 移行後の CPMM プールの手数料ティア。利用可能な設定は API から取得します。      |
| `transferFeeExtensionAuth` | PublicKey | 移行後の Token-2022 ローンチ向けに transfer fee 権限を受け取ります。 |

### 利用可能な CPMM 設定

* Mainnet: [api-v3.raydium.io/main/cpmm-config](https://api-v3.raydium.io/main/cpmm-config)
* Devnet: [api-v3-devnet.raydium.io/main/cpmm-config](https://api-v3-devnet.raydium.io/main/cpmm-config)

### メタデータ

| パラメータ  | 型      | 説明                        |
| ------ | ------ | ------------------------- |
| `name` | string | プラットフォーム名（オンチェーンに保存されます）。 |
| `web`  | string | プラットフォームの website URL。    |
| `img`  | string | プラットフォームの logo URL。       |

***

## プラットフォーム設定の更新

プラットフォーム設定は各 epoch ごとに 1 回更新できます。設定の変更には `updatePlatformConfig()` を使用します。

```typescript
const updatePlatform = async () => {
  const raydium = await initSdk()

  const { execute } = await raydium.launchpad.updatePlatformConfig({
    platformAdmin: raydium.ownerPubKey,

    // 単一の設定を更新
    updateInfo: { type: 'updateFeeRate', value: new BN(15000) }, // 1.5% に変更

    txVersion: TxVersion.V0,
  })

  await execute({ sendAndConfirm: true })
}
```

### 利用可能な更新タイプ

| 型                            | 値         | 説明                                              |
| ---------------------------- | --------- | ----------------------------------------------- |
| `updateFeeRate`              | BN        | プラットフォームの取引手数料率を更新                              |
| `updateClaimFeeWallet`       | PublicKey | 手数料収集ウォレットを変更                                   |
| `updateLockNftWallet`        | PublicKey | Fee Key NFT の受取先を変更                             |
| `updateVestingWallet`        | PublicKey | vesting ウォレットを変更                                |
| `updateCpConfigId`           | PublicKey | 移行時の CPMM 手数料ティアを変更                             |
| `updateName`                 | string    | プラットフォーム名を更新                                    |
| `updateWeb`                  | string    | website URL を更新                                 |
| `updateImg`                  | string    | logo URL を更新                                    |
| `migrateCpLockNftScale`      | object    | LP 配分比率を更新                                      |
| `updatePlatformVestingScale` | BN        | プラットフォームの vesting 割り当てを更新                       |
| `updatePlatformCpCreator`    | PublicKey | graduation 後の fee recipient として publicKey を渡します |
| `updateAll`                  | object    | すべての設定を一度に更新                                    |

***

### ローンチパラメータの強制適用（任意）

プラットフォームでは、許可するトークン設定を制限できます。creator のパラメータが許可された設定と一致しない場合、トランザクションは失敗します。

```typescript
import { updatePlatformCurveParamInstruction } from '@raydium-io/raydium-sdk-v2'

// index 1 に許可済み設定を追加
const instruction = updatePlatformCurveParamInstruction(
  LAUNCHPAD_PROGRAM,
  platformAdmin,
  platformId,
  1, // index (0-254)
  {
    migrateType: 1,                              // 0 = AMM, 1 = CPMM
    migrateCpmmFeeOn: 0,                         // creator 手数料トークン
    supply: new BN('1000000000000000'),          // 10億トークン（decimals 付き）
    totalSellA: new BN('793100000000000'),       // カーブ上で約 79.3% を売却
    totalFundRaisingB: new BN('85000000000'),    // 調達する 85 SOL
    totalLockedAmount: new BN('0'),              // vesting なし
    cliffPeriod: new BN('0'),
    unlockPeriod: new BN('0'),
  }
)
```

### パラメータ強制適用の仕組み

* 最大 25 個の設定を保存可能（index 0-254）
* そのフィールドの検証をスキップするには、パラメータを `null` に設定します
* creator は少なくとも 1 つの設定と完全に一致する必要があります
* 設定は各 epoch ごとに 1 回更新できます

**例:** 調達額は柔軟だが供給量は固定にする:

```typescript
{
  supply: new BN('1000000000000000'),     // ちょうど 10 億である必要があります
  totalFundRaisingB: null,                // 任意の金額を許可
  // ... other params
}
```

***

### プラットフォーム ID の導出

作成後、プラットフォーム ID は管理者ウォレットから導出されます:

```typescript
import { getPdaPlatformId, LAUNCHPAD_PROGRAM } from '@raydium-io/raydium-sdk-v2'

const { publicKey: platformId } = getPdaPlatformId(
  LAUNCHPAD_PROGRAM,
  adminWallet
)
```

これを共有してください `platformId` あなたのプラットフォームでローンチしたいトークン creator に。
