Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
CPMM のプログラム ID と PDA シードは reference/program-addresses に正式に記載されています。このページでは、各アカウントの用途と保持する不変量に焦点を当てており、ハードコードされたアドレスではありません。

CPMM プールの 6 つのアカウント

すべての CPMM プールは、CPMM プログラム下の 6 つのプログラム派生アドレス(PDA)と、それが参照する 1 つの共有 AmmConfig アカウントで完全に記述されます。2 つのミントがあれば、ネットワークに接触することなく、すべてを決定論的に導出できます。 および共有設定: および 1 つのオプションのクリエイターごとのアカウント:

2 つのミントだけからプールを導出

プール PDA を導出する前に、常にミントをソートしてください。 シードはユーザー順ではなく、バイト順で 2 つのミントをハッシュします。(A, B) と (B, A) を持つ 2 つのプールはオンチェーンで衝突します — ソートはプログラムがマッピングを正規にする方法です。
プール ID は常に正規 PDA ではありません。 Initialize は、上記の PDA に加えて、pool_state として任意の署名者キーペアを受け入れます。渡されたアカウントが正規 PDA と一致しない場合、プログラムはそれが署名者であることを要求します — つまり、クリエイターが署名する新しいキーペアを渡します。これはフロントラン防御です:正規 PDA を掴もうとしている第三者は、正当なクリエイターがランダムキーペアを代わりに使用することで回避できます。ダウンストリーム PDA(lpMint、vault0、vault1、observation)は依然として poolState.key() から導出されるため、使用されたアドレスに関わらず一意のままです。プールをインデックス化するときは、正規 PDA を導出することではなく、オンチェーン状態からプール ID を発見してください(例:CPMM プログラム下の PoolState アカウント)— 後者はランダムキーペアプールを見落とします。

アカウントレイアウト

完全な Rust 定義は raydium-cp-swap ソースにあります。以下のフィールドは統合から読み取るものです。

PoolState

実際に読み取るべきもの:
  • lp_supply — プールの内部 LP 合計。LP ミントの供給量と 等しくありません:ロックされた 100 ユニットがここでカウントされるが決してミントされないため、正確に 100 ベースユニット高くなります。すべての LP シェア計算(デポジット、ウィズドロー)は lp_supply で除算するため、このフィールドを使用し、ミントのオンチェーン供給量を代用しないでください。
  • protocol_fees_token{0,1}、fund_fees_token{0,1} — 蓄積された フィーで、まだスイープされていません。これらはスワップ価格に影響しません;CollectProtocolFee / CollectFundFee が呼び出されるまでボルトに留まります。protocol_fees_token{0,1} はクリエイターフィーが収集されるときにプロトコルのシェアも受け取るため、スワップ外で増加します — products/cpmm/fees を参照してください。
  • status — Swap、Deposit、Withdraw が許可されているかどうかを制御するビットマスク。UpdatePoolStatus を介して管理者によって更新されます。SDK はトランザクションを構築する前にこれをチェックします;CPI で直接実行している場合は、自分でチェックしてください。
  • token0_program / token1_program — 各ボルトの CPI に使用するトークンプログラム。1 つはクラシック SPL Token で、もう 1 つは Token-2022 である可能性があります;それらは独立しています。
  • open_time — Unix タイムスタンプ。この時刻前のスワップは失敗します。デポジットは open_time 前に許可されるため、プールをシードできます。
  • creator_fee_on / enable_creator_fee — 一緒にこのプールのオプションのクリエイターフィーがアクティブかどうか、およびスワップのどちら側から収集されるかを制御します。enable_creator_fee == false はクリエイターフィーパスを完全にゼロにします。有効な場合、creator_fee_on は以下を選択します:0 = スワップ入力であるトークンからフィーを取得(BothToken);1 = token_0 からのみフィーを取得(token_1 → token_0 スワップをスキップ);2 = token_1 からのみフィーを取得。InitializeWithPermission を介してプール作成時に設定;その後変更できません。
  • creator_fees_token_{0,1} — 蓄積されたクリエイターフィー、CollectCreatorFee または CollectCreatorFeePermissionless によってスイープされます。両方のパスは完全なカウンターをゼロにしますが、2026-09-19 クリエイターフィー配分アップグレード以降、残高の一部だけがプールを離れます:プロトコルのシェアは protocol_fees_token_{0,1} に追加され、残りはクリエイターに転送されます。パーミッションレスパスは受信者を pool_creator の正規 ATA に固定します。PoolState 自体は変更されていません — 共有額の個別カウンターはありません。

AmmConfig

注意すべき 3 つのこと:
  1. trade_fee_rate と creator_fee_rate は取引量の分数で、両方とも 1/1_000_000 の単位で表示されます。2500 は取引量の 0.25% を意味します。protocol_fee_rate と fund_fee_rate は トレードフィーの 分数(取引量ではなく)で、同じ 1/1_000_000 分母です。クリエイターフィーはトレードフィーの分数ではなく、独立したレートです。完全な計算は products/cpmm/fees にあります。
  2. index は u16 なので、シードハッシュは 2 バイトのビッグエンディアンを使用します。バイト順のオフバイワンは一般的な統合バグです。
  3. AmmConfig はプールレベルで不変です。 プールは作成時に 1 つの AmmConfig を指し、決して切り替わりません。フィー変更は、プールが各スワップで設定を読み取るため伝播します — しかしプールはフィーティア間で移動できません。
クリエイターフィーに関する注記:レート自体(creator_fee_rate)は AmmConfig に存在し、フィーティア全体で共有されます。特定のプールが実際にそれを請求するかどうか(enable_creator_fee)、およびスワップのどちら側に着地するか(creator_fee_on)は PoolState に存在します。クリエイターフィーはトレードフィーの 独立した ものです — それは独自のレート、独自のカウンター(creator_fees_token_{0,1})に蓄積され、トレードフィーの LP / プロトコル / ファンドシェアを削減することはありません。スイープは CollectCreatorFee または宛先制約付き CollectCreatorFeePermissionless を介して行われ、両方のパスは蓄積残高のシェアをプロトコルに渡します — creator_fee_share_rate で、またはその (creator, amm_config) ペアに対して CreatorFeeShare PDA が存在する場合はそのレートで。完全なメカニクスについては products/cpmm/fees を参照してください。

Permission

InitializeWithPermission で使用される小さなアクセス制御アカウント。CPMM プログラムは、他のプログラム(例:LaunchLab がトークンを CPMM に卒業させるとき)が特定の AmmConfig に対してプールを作成する権利があることを証明できるように、パーミッション付きプール作成パスをサポートしています。
Permission PDA は CreatePermissionPda を介して CPMM 管理者または専用パーミッション PDA クリエイター権限によって作成されます。2026-09 アップグレード以降、ClosePermissionPda は同じ 2 つの署名者を受け入れます;以前は管理者のみでした。エンドユーザーはこのアカウントと直接対話しません — クロスプログラムフローのための配管です。ロール境界については security/admin-and-multisig を、正規アドレスについては reference/program-addresses を参照してください。

CreatorFeeShare

1 つの (pool creator, AmmConfig) ペアのクリエイターフィーのプロトコルシェアをオーバーライドするオプションアカウント。2026-09-19 クリエイターフィー配分アップグレードで追加。
動作方法:
  • オプションですが、アカウントは命令では決してオプションではありません。 CollectCreatorFee と CollectCreatorFeePermissionless は両方とも上記のシード制約で creator_fee_share を宣言し、すべての呼び出しで取得します。プログラムはアカウントが空または外部所有かどうかをチェックします;そうであれば AmmConfig.creator_fee_share_rate にフォールバックします。クライアントは、アカウントが存在するかどうかに関わらず、常にアドレスを導出して渡す必要があります。
  • share_rate は作成時に FEE_RATE_DENOMINATOR_VALUE(1_000_000)でキャップされ、分割実行時に再度キャップされます。1_000_000 はクリエイターフィー全体をプロトコルにルーティングします;0 はそれをルーティングしません。
  • 管理者または専用権限によって作成および閉鎖 CreateCreatorFeeShare / CloseCreatorFeeShare を通じて。閉鎖するとレントを署名者に返し、ペアを設定デフォルトにフォールバックさせます;プールクリエイターはどちらのパスでも署名者ではありません。
  • プールではなくクリエイターでキー化されます。 1 つのアカウントがそのクリエイターがその AmmConfig で持つすべてのプールを管理します。2 つのフィーティアでプールを持つクリエイターは両方でカバーされるために 2 つのアカウントが必要です。
それが駆動する分割計算は products/cpmm/fees にあります。

ボルトと Token-2022

vault0 と vault1 は CPMM authority PDA が所有し、それらのトークンプログラムオーナー(token_program)は SPL Token または Token-2022 で、プール作成時にミントのプログラムによって決定されます。プールは 2 つのケースを透過的に処理します — Swap / Deposit / Withdraw 命令アカウントで各側の正しいトークンプログラム ID を渡します。 CPMM はプール作成時に厳密な 拡張許可リスト を強制します(utils/token.rs の is_supported_mint)。Token-2022 ミントは、それが持つ すべての 拡張がこのリストにある場合にのみ CPMM プールで使用できます:
  • TransferFeeConfig。 ミントによってすべての転送に適用されます。プールは SwapBaseInput デポジットの受信側で、ウィズドロー時の送信側です。プログラムはボルトに着地する ネット 金額を計算し、曲線をそれに応じて設定します。algorithms/token-2022-transfer-fees を参照してください。
  • MetadataPointer および TokenMetadata。 ミント上の標準メタデータ。スワップ計算に影響なし。
  • InterestBearingConfig。 ミントの UI 金額は利息を蓄積します。ボルトは生の金額を保存;曲線は生の金額でのみ動作します。APR を表示する UI は Token-2022 ヘルパーを呼び出して UI 金額をレンダリングする必要があります。
  • ScaledUiAmount。 UI 表示スケーリング拡張。InterestBearingConfig と同じ処理 — 曲線は生の金額を使用します。
その他の拡張 — PermanentDelegate、TransferHook、DefaultAccountState、NonTransferable、ConfidentialTransfer、Group/GroupMember、MintCloseAuthority など — は Initialize を NotSupportMint で拒否させます。1 つの例外は ミントごとのレジストリ です:シード [b"support_mint", mint] に SupportMintAssociated PDA が存在する場合、ミントは拡張セットに関わらず許可されます。その PDA は管理者(または専用サポートミント権限)によって CreateSupportMintAssociated / CloseSupportMintAssociated を通じて作成および削除されるため、特定のミントのオンボーディングはプログラムアップグレードを必要としなくなります。
2026-09 で変更。 CPMM は以前、拡張チェックをショートサーキットするハードコードされた 4 アドレス MINT_WHITELIST も持っていました。そのアレイは 削除されました;レジストリ PDA は現在唯一のバイパスです。ハードコードされたリストに依存していたミントは、新しいプールを作成する前に SupportMintAssociated PDA が必要です — 既存のプールは影響を受けません。チェックはプール作成時にのみ実行されるためです。
検証済み拡張リストは CP-Swap ソースの programs/cp-swap/src/utils/token.rs にあり、将来のプログラムアップグレードで変更される可能性があります。クロスプログラムマトリックスについては reference/token-2022-support を参照してください。

Observation

観測アカウントは ObservationState エントリのリングバッファで、各エントリは block_timestamp と 累積価格 を保存します。すべてのスワップで、最後のスワップ以降に十分な時間が経過している場合、プログラムは新しい観測を追加します。TWAP は 2 つの観測を読み取り、Δcumulative / Δtime を除算することで計算されます。
リングバッファは 100 観測 用にサイズ設定されています。各観測は 40 バイト(8 + 16 + 16)なので、アレイだけで 4,000 バイト;ObservationState::LEN は正確に 4,075 バイト(8 + 1 + 2 + 32 + 4,000 + 8 × 4)です。 2 つのコンシューマルール:
  • 単一の観測を価格として使用しないでください。 これは 累積 であり、スポット価格ではありません。TWAP を計算するために 2 つを使用してください。
  • 少なくとも 1 ブロック離れた観測を選択してください。 同じブロック内のスワップは新しい観測を生成しない可能性があります;バックツーバックで読み取ると同じレコードが返される可能性があります。
詳細な計算は products/clmm/accounts にあります。

アカウントライフサイクル

CPMM プールとその PDA は 決して閉じられません。Permission、SupportMintAssociated、CreatorFeeShare は例外です — それらはプール状態ではなく、スタンドアロン管理者管理レコードであり、各々に明示的なクローズ命令があります。ゼロリクイディティでも poolState は残ります。これは意図的です:後で同じプールを再シードすると、その履歴観測バッファが保持され、その PDA 導出は安定したままです。

どこで何を読むか

ソース: