> ## 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 カーブルール

> プラットフォームが起動パラメータをどのように制限するか：チェックグループ、(フィールド、オペレータ、値)制約モデル、および9つのプレイブック — 正確なティア、値バンド、卒業時評価上限、マイグレーションフロア、トークンタイプゲーティング、時間制限プロモーション。

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

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

<Info>
  **カーブルール**は、プラットフォームが「どの起動をホストするか」という質問に対する答えです。[`GlobalConfig`](/ja/products/launchlab/global-config)はプロトコルフロアを設定します — 最低10M供給、供給の最低20%がカーブで販売される、など — これらのフロアは意図的に広く設定されているため、あらゆる種類のプラットフォームがそれに適合します。カーブルールは、プラットフォームがこれらを実際にサポートする製品の形状に絞り込む場所です。

  ルールは独自の`PlatformCurveRule`アカウントに存在し、(プラットフォーム、[`GlobalConfig`](/ja/products/launchlab/global-config))ペアごとに1つです。これらはすでに設定で許可されているものを絞り込むことのみができます。ルールはプロトコル制限を広げることはできません。
</Info>

## メンタルモデル

外側から内側へ、3つのレベル：

```
GlobalConfig       プロトコルフロア      "supply >= 10M, sell rate >= 20%, ..."
  └─ PlatformCurveRule   あなたのルール     "そして私のプラットフォーム上で：これらの形状のいずれか"
       └─ check group    1つの形状     "supply = 1B AND fund raising in [80, 90] SOL"
            └─ constraint 1つのチェック    "(Supply, Eq, 1_000_000_000)"
```

2つのレベルのネストがこれを表現力豊かにします：

* **1つのグループ内の制約はANDされます。** すべてが成立する必要があります。
* **1つのルール内のグループはORされます。** 起動は単一のグループを満たすとすぐに許可されます。

したがって、グループは1つの許可された*形状*であり、ルールはあなたが提供する形状のメニューです。ルールは最大10グループを保持でき、グループは最大25制約を保持できます。

覚えておく価値のある2つの境界ケース：

| 状態                       | 意味                                    |
| ------------------------ | ------------------------------------- |
| ルールアカウントなし、またはゼログループのルール | プラットフォームはそのコンフィグの起動パラメータを制限しません。      |
| ゼロ制約のグループ                | そのグループはすべての起動に一致するため、ルール全体がすべてを許可します。 |

ルールは`PlatformConfig.restrict_curve_param`が`1`の場合にのみ有効になります。`0`の場合、プログラムはルールをまったく読みません。これはルールをロールアウトしてロールバックするために使用するスイッチでもあります。

## 制約

制約は`(フィールド、オペレータ、値)`の3つ組です。それ以上何もありません — 式もネストもありません。

```rust theme={null}
pub struct ParamConstraint {
    pub field: u8,    // どの起動パラメータか、下の表を参照
    pub op:    u8,    // 0 Eq, 1 Gte (min), 2 Lte (max), 3 Neq
    pub value: u128,
}
```

**範囲は2つの制約**で、1つのグループ内の同じフィールドに対して：フロア用の`Gte`と上限用の`Lte`。同じ`(フィールド、オペレータ)`ペアは1つのグループ内に2回現れることはできません。これは矛盾する2つの最小値を書くことを防ぎます。

### フィールド

<Info>
  フィールドIDは永続的です。新しいフィールドは常に追加されるだけなので、ルールアカウントがそれを保持すると、IDの意味は変わりません。
</Info>

| id | フィールド                    | 単位          | 注記                                                 |
| -- | ------------------------ | ----------- | -------------------------------------------------- |
| 0  | `CurveType`              | enum        | 0 定数積、1 固定価格、2 線形価格                                |
| 1  | `MigrateType`            | enum        | 新しい起動は`1`(CPMM)である必要があります                          |
| 2  | `MigrateCpmmFeeOn`       | enum        | 0 クォートのみ、1 両トークン                                   |
| 3  | `Supply`                 | 基本単位        | 完全なトークン供給                                          |
| 4  | `TotalSellA`             | 基本単位        | カーブで販売。定数積コンフィグのみ — [カーブタイプ制限](#カーブタイプ制限)を参照       |
| 5  | `TotalFundRaisingB`      | クォート単位      | 卒業目標                                               |
| 6  | `TotalLockedAmount`      | 基本単位        | ベスティング予算                                           |
| 7  | `CliffPeriod`            | 秒           | ロック解除開始前の待機                                        |
| 8  | `UnlockPeriod`           | 秒           | ロック解除期間                                            |
| 9  | `BaseTokenProgram`       | enum        | 0 SPL Token、1 Token-2022                           |
| 10 | `TransferFeeEnabled`     | bool        | ベースミントが`TransferFeeConfig`を持つ場合は1                  |
| 11 | `TransferFeeBasisPoints` | 1/10 000    | 拡張なしの場合は0                                          |
| 12 | `TransferFeeMaximumFee`  | 基本単位        | 拡張なしの場合は0                                          |
| 13 | `SellRateA`              | 1/1 000 000 | 導出：`TotalSellA / Supply`。定数積のみ                     |
| 14 | `LockRate`               | 1/1 000 000 | 導出：`TotalLockedAmount / Supply`                    |
| 15 | `MigrateAmountA`         | 基本単位        | 導出：`Supply − TotalSellA − TotalLockedAmount`。定数積のみ |
| 16 | `MigrateRateA`           | 1/1 000 000 | 導出：`MigrateAmountA / Supply`。定数積のみ                 |
| 17 | `FundRaisingRateB`       | 1/1 000 000 | 導出：`TotalFundRaisingB / Supply`                    |
| 18 | `UnixTimestamp`          | 秒           | 起動のブロック時間                                          |

導出フィールドはルールをポータブルにするものです。`Supply`と`TotalFundRaisingB`を正確な数値に固定すると、1つの起動形状が固定されます。`FundRaisingRateB`を制約すると、それらの間の*関係*が固定され、クリエイターが任意の供給を選択できるようになります。

<Warning>
  レートフィールドは1つの`GlobalConfig`内でのみ比較可能です。分母がそのコンフィグのクォートミントとそのデシマルに依存するためです。これは実際には制限ではありません：ルールは構造上1つのコンフィグにスコープされています。
</Warning>

## 9つのプレイブック

以下の各プレイブックは1つのルールです。制約は`(フィールド、オペレータ、値)`として記述されます。

### 1. 1つの標準ティア

最も単純なルール、および廃止されたカーブパラメータホワイトリストが提供した正確な動作：1つの形状、固定。

| グループ | 制約                                                                                                |
| ---- | ------------------------------------------------------------------------------------------------- |
| 0    | `(Supply, Eq, 1_000_000_000e6)`、`(TotalSellA, Eq, 800_000_000e6)`、`(TotalFundRaisingB, Eq, 85e9)` |

3つのいずれかで逸脱する起動は`CurveParamNotMatchPlatformRule`で拒否されます。

### 2. 数値の代わりにバンド

バンドが存在する理由：クリエイターはあなたが快適な資金調達目標を選択でき、あなたがすべての値を列挙する必要がありません。

| グループ | 制約                                                                                                 |
| ---- | -------------------------------------------------------------------------------------------------- |
| 0    | `(Supply, Eq, 1_000_000_000e6)`、`(TotalFundRaisingB, Gte, 50e9)`、`(TotalFundRaisingB, Lte, 200e9)` |

1つのグループ、4つの制約、クリエイターは50～200 SOLの廊下を持ちます。古いホワイトリストでは、これは許可された値ごとに1つのエントリが必要でした。10エントリの上限により、不可能でした。

### 3. ティアを並べて

グループはORされるため、各ティアはグループです。

| グループ | 制約                                                                 | ティア |
| ---- | ------------------------------------------------------------------ | --- |
| 0    | `(Supply, Eq, 1_000_000_000e6)`、`(TotalFundRaisingB, Eq, 85e9)`    | 標準  |
| 1    | `(Supply, Eq, 100_000_000e6)`、`(TotalFundRaisingB, Eq, 30e9)`      | 小   |
| 2    | `(Supply, Eq, 10_000_000_000e6)`、`(TotalFundRaisingB, Gte, 500e9)` | クジラ |

順序は計算に関係し、セマンティクスには関係ありません：評価は最初に一致するグループで停止するため、最も使用されるティアを最初に配置します。

### 4. 卒業時評価バンド

`FundRaisingRateB`は`TotalFundRaisingB / Supply`（百万分の1）です。これを制約すると、クリエイターが選択した供給に関係なく、トークンがどれほど豊かに卒業できるかが制限されます。

| グループ | 制約                                                                   |
| ---- | -------------------------------------------------------------------- |
| 0    | `(FundRaisingRateB, Gte, 60_000)`、`(FundRaisingRateB, Lte, 120_000)` |

1e12供給と9小数点のクォートミントを使用すると、`85e9 / 1e12 × 1e6 = 85_000`がそのバンド内に収まります。供給を2倍にするクリエイターは、それに留まるために目標をほぼ2倍にする必要があります — これが要点です。2つの制約は、そうでなければ`(供給、目標)`ペアのテーブルになるものを置き換えます。

### 5. マイグレーションフロア

`MigrateRateA`は、卒業時にCPMMプールに実際に到達する供給のシェアです：`Supply − TotalSellA − TotalLockedAmount`を供給で割ったもの。これは卒業したプールの深さであり、ルールが存在する前にプラットフォーム側の同等物がない唯一のプロトコルノブです。

| グループ | 制約                             |
| ---- | ------------------------------ |
| 0    | `(MigrateRateA, Gte, 150_000)` |

供給の最低15%がプールに到達します。クリエイターは曲線上で95%を販売し、浅い本を後に残すことはできません。

<Note>
  パラメータが加算されない場合 — ロック額が曲線販売後に残されたものより大きい — 導出値を計算できず、制約は閉じた状態で失敗するため、起動は黙って許可されるのではなく拒否されます。
</Note>

### 6. 実際に実施するベスティング

`GlobalConfig.max_lock_rate`はベスティングを上から制限します。ルールはそれの下にフロアを置き、実際の崖を要求できます。

| グループ | 制約                                                                                   |
| ---- | ------------------------------------------------------------------------------------ |
| 0    | `(LockRate, Gte, 50_000)`、`(LockRate, Lte, 200_000)`、`(CliffPeriod, Gte, 2_592_000)` |

供給の5～20%がベストされ、最低30日間の崖があります。「インスタントアンロック起動なし」というピッチのプラットフォームに役立ちます。

### 7. トークンタイプゲーティング

`BaseTokenProgram`と`TransferFeeEnabled`は独立しており、これは重要です：`TransferFeeConfig`のないToken-2022ミントは、SPL Tokenミントと同じように`TransferFeeEnabled = 0`を報告します。

| 意図                  | グループ | 制約                                                        |
| ------------------- | ---- | --------------------------------------------------------- |
| SPL Tokenのみ         | 0    | `(BaseTokenProgram, Eq, 0)`                               |
| Token-2022のみ        | 0    | `(BaseTokenProgram, Eq, 1)`                               |
| Token-2022、転送手数料なし  | 0    | `(BaseTokenProgram, Eq, 1)`、`(TransferFeeEnabled, Eq, 0)` |
| 転送手数料なし、どちらのプログラムでも | 0    | `(TransferFeeEnabled, Eq, 0)`                             |

### 8. 条件付き転送手数料上限

「if」オペレータはなく、必要ありません — 2つのグループが条件を表現します。

| グループ | 制約                                                                                                       | 読み方                      |
| ---- | -------------------------------------------------------------------------------------------------------- | ------------------------ |
| 0    | `(TransferFeeEnabled, Eq, 0)`                                                                            | 転送手数料なし：問題なし             |
| 1    | `(TransferFeeEnabled, Eq, 1)`、`(TransferFeeBasisPoints, Lte, 100)`、`(TransferFeeMaximumFee, Gte, 1_000)` | 手数料付き：最大1%、実際に設定された最大手数料 |

ゼロレート`TransferFeeConfig`はグループ0をスリップしません：拡張が存在するため、`TransferFeeEnabled`は`1`であり、グループ1のみがそれを受け入れることができます。

### 9. 時間制限プロモーション、事前にスケジュール

`UnixTimestamp`は起動のブロック時間であるため、グループは独自の有効期間を持つことができます。両方のグループを今日書き、スイッチオーバーは自動的に発生します。

| グループ | 制約                                                                     | ウィンドウ          |
| ---- | ---------------------------------------------------------------------- | -------------- |
| 0    | `(UnixTimestamp, Lte, 1_767_225_600)`、`(TotalFundRaisingB, Gte, 30e9)` | プロモ期間：最低30 SOL |
| 1    | `(UnixTimestamp, Gte, 1_767_225_601)`、`(TotalFundRaisingB, Gte, 80e9)` | その後：最低80 SOL   |

境界でトランザクションは必要ありません。コストは1つのグループスロットの代わりに2つです。

## カーブタイプ制限

4つのフィールドが`TotalSellA`を読みます：`TotalSellA`、`SellRateA`、`MigrateAmountA`、`MigrateRateA`。定数積コンフィグでは、クリエイターがその数値を提供します。固定価格または線形価格コンフィグでは、曲線が代わりにそれを導出し、プログラムが比較する値は`0`です。これはすべての起動を拒否します。

あなたが自分のコンフィグを黙って拒否するルールを書くことを許可する代わりに、プログラムは非定数積コンフィグで書き込み時にこれら4つのフィールドを拒否し、`CurveRuleFieldNotSupportedByCurve`を返します。現在は定数積コンフィグのみが存在するため、実際にはこのエラーに遭遇することはありません。

## 送信する前にチェック

オンチェーンチェックの両方向はオフチェーンで利用可能なため、クリエイターもプラットフォームも、トランザクションが戻るのを見てルールを学ぶ必要はありません。

<Info>
  **バージョンバナー。**

  * SDK：`@raydium-io/raydium-sdk-v2@0.2.42-alpha`は、このサイトの他のすべてのコードデモが固定されているバージョンです。以下の2つのヘルパーは、カーブルールサポートを提供するSDKリリースで到着します。それまでは、プログラムの`platform_curve_rule.rs`からそれらをポートするか、プログラムを呼び出してエラーコードを読んでください。
  * クラスタ：最初にSolana `devnet`でテストしてください — [最初にdevnetでテスト](#最初にdevnetでテスト)を参照してください。
  * プログラムID：[`reference/program-addresses`](/ja/reference/program-addresses)を参照してください

  両方のヘルパーは純粋な関数です。RPCに触れないため、フォーム内のすべてのキーストロークで実行しても安全です。
</Info>

### 起動前：これらのパラメータは合格しますか？

`checkLaunchAgainstCurveRule`はプログラムの起動時チェックを正確に反映し、その失敗閉じた動作を含みます。起動フォームで実行すると、クリエイターが戻ったトランザクションに支払うことを許可する代わりに、理由を付けて送信ボタンを無効にできます。

```ts theme={null}
import {
  checkLaunchAgainstCurveRule,
  getPdaPlatformCurveRule,
  LaunchpadCurveRuleBaseTokenProgram,
  LaunchpadCurveRuleField,
  PlatformCurveRule,
} from "@raydium-io/raydium-sdk-v2";
import BN from "bn.js";

const platformConfig = await raydium.launchpad.getPlatformConfig(platformConfigId);

// 0の場合、プログラムはルールをまったく読まないため、チェックするものはありません
if (platformConfig.restrictCurveParam !== 0) {
  const ruleId = getPdaPlatformCurveRule(programId, platformConfigId, configId).publicKey;
  const ruleAccount = await connection.getAccountInfo(ruleId);

  const result = checkLaunchAgainstCurveRule({
    // アカウントが存在しない場合はundefined — プラットフォームはこのコンフィグのルールを書きませんでした
    rule: ruleAccount === null ? undefined : PlatformCurveRule.decode(ruleAccount.data),
    context: {
      curveType: globalConfig.curveType,
      migrateType: 1,
      migrateCpmmFeeOn: 0,
      supply: new BN("1000000000000000"),
      totalSellA: new BN("793100000000000"),
      totalFundRaisingB: new BN("85000000000"),
      totalLockedAmount: new BN(0),
      cliffPeriod: new BN(0),
      unlockPeriod: new BN(0),
      baseTokenProgram: LaunchpadCurveRuleBaseTokenProgram.SplToken,
      // ベースミントが転送手数料拡張を持たない場合、transferFeeを完全に省略します
      unixTimestamp: new BN(Math.floor(Date.now() / 1000)),
    },
  });

  if (!result.ok) {
    // すべてのグループが起動を拒否しました。各エントリはそのグループの失敗したすべての制約をリストします
    for (const group of result.groupFailures) {
      for (const c of group.unsatisfied) {
        console.log(
          `group ${group.groupId}: ${LaunchpadCurveRuleField[c.field]} is ${c.actual ?? "not computable"},`,
          `rule wants op ${c.op} ${c.value.toString()}`,
        );
      }
    }
  }
}
```

ヘルパーが近似するのではなく再現する3つのこと：

* **ルールアカウントがない、ルールにグループがない、両方とも合格します。** グループに制約がない場合も同様です。存在しないアカウントの場合は`rule: undefined`を渡します。それを拒否として扱わないでください。
* **計算不可能な値は閉じた状態で失敗します。** ゼロ供給にはレートがなく、曲線販売が残したものより大きいロック額にはマイグレーション額がありません。`actual`は`undefined`で戻り、制約はオンチェーンと同じように満たされていないとカウントされます。
* **最初だけでなく、すべての失敗した制約が報告されます。** プログラムは判定が必要なため短絡します。ヘルパーはすべてを収集するため、フォームは一度にすべての問題をリストできます。

それが知ることができない唯一のことは、トランザクションが実際に到達するブロック時間です。ルールが`UnixTimestamp`を境界の近くで使用する場合、合格を暫定的に扱います。

### ルールを書く前に：このグループは有効ですか？

`checkCurveRuleGroupWritable`は`UpdatePlatformCurveRule`の書き込み時検証を反映します — 制約ID、重複した`(フィールド、オペレータ)`ルール、両方のカウント制限、カーブタイプ制限。署名する前にプラットフォーム管理ツールで実行します。

```ts theme={null}
import {
  checkCurveRuleGroupWritable,
  LaunchpadCurveRuleField,
  LaunchpadCurveRuleOp,
} from "@raydium-io/raydium-sdk-v2";

const constraints = [
  { field: LaunchpadCurveRuleField.Supply, op: LaunchpadCurveRuleOp.Eq, value: new BN("1000000000000000") },
  { field: LaunchpadCurveRuleField.TotalFundRaisingB, op: LaunchpadCurveRuleOp.Gte, value: new BN("50000000000") },
  { field: LaunchpadCurveRuleField.TotalFundRaisingB, op: LaunchpadCurveRuleOp.Lte, value: new BN("200000000000") },
];

const writable = checkCurveRuleGroupWritable({
  groupId: 0,
  constraints,
  curveType: globalConfig.curveType,
  // ルールが既に保持しているID、グループを置き換えることが1つを追加することと間違えられないようにするため
  existingGroupIds: existingRule?.groups.map((g) => g.groupId) ?? [],
});

// 各エラーは、トランザクションが失敗したプログラムエラーコードを持ちます
if (!writable.ok) console.log(writable.errors);
```

<Note>
  このチェックに合格することは、トランザクションが不正な形式で拒否されないことを意味します。あなたが意図したルールであるかどうかについては何も言いません — グループは完全に有効でありながら、UIが生成できるすべての起動を拒否することができます。それが上記の起動側チェックの目的です：グループを書いた後、製品が提供できるすべての形状を`checkLaunchAgainstCurveRule`で実行し、各形状がまだグループを見つけることを確認します。
</Note>

### 最初にdevnetでテスト

メインネットで`restrict_curve_param`を有効にすると、クリエイターが何をできるかが即座に変わり、すべての起動に対して変わります。メインネットに触れる前に、devnet上でシーケンス全体をリハーサルしてください：

1. devnetでプラットフォームコンフィグとルールを作成し、出荷する予定の同じグループを書きます。
2. UIが生成できるすべての起動形状を`checkLaunchAgainstCurveRule`で実行し、判定が期待したものであることを確認します — 合格すべき形状と拒否すべき形状の両方。
3. `restrict_curve_param`を有効にしてから、合格すべきトークンと拒否すべきトークンを実際に起動します。2番目は`CurveParamNotMatchPlatformRule`(`6025`)で失敗する必要があります。`NotEnoughRemainingAccounts`(`6018`)ではなく — 後者はビルダーがルールPDAを追加していないことを意味し、チェックが実際に実行されていません。
4. その後のみメインネットで同じ順序で繰り返します。

ステップ3は主張する価値があります。オフチェーンヘルパーとオンチェーンプログラムは同じルールの2つの実装であり、devnet起動はあなたのルールに対して同意することを証明します — ビルダーがアカウントをすべて渡すことを含めて。

## ルールの運用

### 委任されたマネージャー

ルールの編集は日常的な作業です。プラットフォーム管理キーは通常マルチシグです。`PlatformConfig.curve_rule_manager`はまさにそのために存在します：`UpdatePlatformConfig::CurveRuleManager`を通じて一度設定すると、そのホットウォレットはルールアカウントを独自に作成、更新、削除、クローズできます。プラットフォーム管理者は並行して同じ権限を保持するため、失われたマネージャーキーは回復可能です — 別の管理者呼び出しで回転させます。

侵害されたマネージャーキーのスコープ：パラメータルールを緩和または削除でき、ルールアカウントのレントを回収できます。手数料ウォレット、ベスティング、CPMMコンフィグに触れることはできず、`restrict_curve_param`をフリップすることはできず、`GlobalConfig`制限を破ることはできません。これを設定キーとして扱い、財務キーではありません。

### レントはコンテンツに従う

ルールアカウントはグループを保持せずに作成され、変更のたびにサイズ変更されるため、実際に書いたルールに対して支払います。グループを削除すると、差分が署名者に払い戻されます。

| ルールコンテンツ     | アカウントサイズ | レント          |
| ------------ | -------- | ------------ |
| 空（作成されたばかり）  | 150バイト   | \~0.0019 SOL |
| 1グループ、2制約    | 200バイト   | \~0.0023 SOL |
| 3グループ、各4制約   | 408バイト   | \~0.0037 SOL |
| 10グループ、各25制約 | 4 790バイト | \~0.034 SOL  |

### ロールアウト順序

1. devnet上でシーケンス全体をリハーサルしてください — [最初にdevnetでテスト](#最初にdevnetでテスト)を参照してください。
2. ルールアカウントを作成し、グループを書きます。まだ何も変わりません — `restrict_curve_param`がまだ`0`の場合、プログラムはそれらを読みません。
3. [`checkLaunchAgainstCurveRule`](#起動前これらのパラメータは合格しますか)でルールをオフチェーンでチェックします：UIが生成できるすべての起動形状について、何らかのグループがそれを受け入れることを確認します。
4. `restrict_curve_param`を`1`に設定します。その時点からクリエイターの起動がチェックされます。
5. ロールバックするには、再度`0`に設定します。ルールアカウントはそのまま残ります。

<Warning>
  起動ビルダーは`restrict_curve_param`が`1`の間、ルールPDAを`remaining_accounts`に追加する必要があります。プログラムはアカウントが存在しない場合でも存在することを要求するため、クリエイターはそれを省略してチェックをスキップできません — 欠落しているアカウントは`NotEnoughRemainingAccounts`であり、合格ではありません。導出は`[b"platform_curve_rule", platform_config, global_config]`です。
</Warning>

## 起動時のコスト

チェックは有効な間、すべての起動で実行されるため、その計算コストは起動ごとの税です。エンドツーエンドで測定 — PDA導出、`remaining_accounts`スキャン、逆シリアル化、評価：

| ルールコンテンツ      | 安いフィールド | 導出フィールド |
| ------------- | ------- | ------- |
| 有効、ルールアカウントなし | 1 936   | —       |
| 1グループ、2制約     | 2 576   | 2 926   |
| 3グループ、各4制約    | 3 624   | 5 724   |
| 10グループ、各25制約  | 24 344  | 68 094  |

「安い」は`Supply`のような直接フィールド読み取りです。「導出」は`MigrateRateA`のような計算されたもので、制約ごとに約223 CUのコストがかかり、約48と比較されます。導出制約の完全に読み込まれたルールでも、デフォルトの200 000 CU/命令予算の3分の1以内に留まり、現実的な3グループルールは6 000未満です。グループは1つが一致するまで評価されるため、一般的なティアを最初に配置することは無料の節約です。

## 次に進む場所

* [`products/launchlab/platform-config`](/ja/products/launchlab/platform-config) — ルールをゲートおよび委任する`PlatformConfig`フィールド。
* [`products/launchlab/global-config`](/ja/products/launchlab/global-config) — ルールが絞り込むプロトコルフロア。
* [`products/launchlab/instructions`](/ja/products/launchlab/instructions) — 4つのルール命令とそのアカウント。
* [`products/launchlab/accounts`](/ja/products/launchlab/accounts) — アカウント在庫の`PlatformCurveRule`。
* [`sdk-api/typescript-sdk`](/ja/sdk-api/typescript-sdk) — 2つのチェックヘルパーが存在するSDK表面。
* [`reference/changelog/2026-08-31-launchlab-platform-curve-rules`](/ja/reference/changelog/2026-08-31-launchlab-platform-curve-rules) — カーブパラメータホワイトリストを置き換えたもの、およびデコーダーが変更する必要があるもの。

ソース：

* `raydium-launch/programs/launchpad/src/states/platform_curve_rule.rs` — `PlatformCurveRule`、`CurveRuleGroup`、`ParamConstraint`、フィールドとオペレータIDスペース、`CurveRuleContext::value_of`。
* `raydium-launch/programs/launchpad/src/utils/platform_curve_rule.rs` — 起動時チェック。
* `raydium-launch/programs/launchpad/src/instructions/platform/` — `create`、`update`、`remove`、`close_platform_curve_rule`。
