Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
このページは権威的な命令リファレンスです。これらの命令を実際に構成するコードについては、products/cpmm/code-demos を参照してください。エラーコードの意味については reference/error-codes を参照してください。2026-09 プログラムアップグレードは CPMM を Anchor 1.0.2 / Solana 3.1.10 で再構築し、管理者命令 CollectExcessLamports を追加し、ハードコードされた Token-2022 ミントホワイトリストを削除し、CreateAmmConfigprotocol_owner / fund_owner に書き込む内容を変更しました。ユーザー向けの命令は、アカウント、引数、数学に変更がありません。2026-09-09 チェンジログエントリ を参照してください。

命令サマリー

ステータスビットマスク:各プールの statusu8 で、ビット 0 = デポジット無効、ビット 1 = 引き出し無効、ビット 2 = スワップ無効(プログラムの PoolStatusBitIndex { Deposit, Withdraw, Swap })です。クリアビットは操作が許可されていることを意味し、セットビットは一時停止されていることを意味します。UpdatePoolStatus は生の u8 を取り、既存の値を上書きします。 次のセクションでは、それぞれについて詳しく説明します。アカウント順序は CPMM IDL に従います。SDK と raydium-cp-swap/programs/cp-swap/src/instructions の Rust クライアントはこの順序に一致します。

Initialize

新しい CPMM プールを作成します。 引数
アカウント(W = 書き込み可能、S = 署名者) * pool_state はランダムキーペアパスでのみ署名します。正規 PDA パスは pool_state 署名なしで実行されます。 前提条件
  • ミントはソート済み(バイト順で token_0_mint < token_1_mint)。
  • どちらのミントも CPMM 許可リスト外の拡張機能を使用していません(TransferFeeConfigMetadataPointerTokenMetadataInterestBearingConfigScaledUiAmount)— products/cpmm/accounts を参照してください。SupportMintAssociated PDA(シード [b"support_mint", mint])が存在するミントは拡張機能チェックをスキップします — ただし、その PDA を remaining_accounts に追加しなければなりません。プログラムは渡されたアカウントのみをスキャンし、PDA 自体を読み込むことは決してないため、アカウントを渡さずにレジストリに依存すると NotSupportMint6007)で失敗します。順序は関係ありません(照合はキーによります)。バイパスが必要なミントごとに 1 エントリを渡してください。このレジストリは、2026-09 アップグレードがハードコードされた 4 ミントホワイトリストを削除した後の唯一のバイパスです。
  • creator は各 ATA で少なくとも init_amount_0init_amount_1 を持っています。
  • amm_config.disable_create_pool == false
事後条件
  • pool_state.lp_supply = sqrt(init_amount_0 * init_amount_1)完全な 平方根です。クリエイターにミントされるのは lp_supply − 100 で、ロックされる 100 ベース単位は lp_supply に計上されるものの決してミントされません。
  • したがってプールの生涯にわたり lp_mint.supply == pool_state.lp_supply − 100 です。すべての LP シェア計算(デポジット、引き出し)は lp_supply で除算するため、このフィールドを使用し、ミントのオンチェーン供給量で代用しないでください。sqrt(...) < 100 の場合は InitLpAmountTooLess で失敗します。
  • observation_state は初期化されます。observation_index = 0 および pool_id = pool_state.key()
  • create_pool_fee ラムポートは作成者から受取人に転送され、ネイティブ SOL として同期されます(wSOL ATA です)。
  • プールのステータスビットマスクは 0(デポジット / 引き出し / スワップすべて有効)です。
  • enable_creator_fee = false および creator_fee_on = BothTokenInitialize はクリエイターフィーの有効化をサポートしていません — そのパスは InitializeWithPermission です。
  • open_time は、呼び出し元が <= block_timestamp の値を渡した場合、block_timestamp + 1 にバンプされます。スワップは open_time の前に拒否されます。デポジットと引き出しはすぐに機能します。
一般的なエラー(完全なリストは reference/error-codes を参照)
  • InvalidInput — ミントがソートされていない、または同一のミント。
  • NotSupportMint — ブロックされた Token-2022 拡張機能。
  • ExceededSlippage — まれに。init_amount_0/1 が小数点の不一致により 0 LP になる場合。

Deposit

プールに比例したリクイディティを両方のトークンで追加します。 引数
アカウント 数学
押さえておくべき詳細が 2 つあります:比例計算のベースは生のボルト残高ではなく、手数料を除いた ボルト合計(vault_amount_without_fee、つまり生の残高から蓄積されたプロトコル、ファンド、クリエイターの各カウンターを差し引いたもの)であること。そしてスリッページ上限は、Token-2022 の転送手数料が加算された に支払者が実際に転送する額に対してチェックされ、ボルトの総移動額に対してではないことです。 k の比例性に変更なし — 合計と lp_supply はどちらも同じ係数でスケーリングされます。 事後条件
  • lp_supply += lp_token_amount
  • vault_0 += needed_token_0(入力の Token-2022 転送フィーを差し引いた額)。
  • vault_1 += needed_token_1(入力の Token-2022 転送フィーを差し引いた額)。
一般的なエラーExceededSlippageZeroTradingTokens、デポジットが一時停止されている場合は InvalidStatus

Withdraw

LP トークンをバーンし、基礎となるトークンを比例配分で受け取ります。 引数
アカウント 最初の 13 アカウントは Deposit と同一で、LP トークンがバーンされるため lp_mint は書き込み可能です。Withdraw はさらに 14 番目のアカウントとして memo_programaddress = memo::ID で制約)を取ります — Deposit は取りません。13 アカウントの Withdraw は Anchor のデシリアライズに失敗するため、LP は退出できません。 数学
事後条件
  • lp_supply -= lp_token_amount
  • ボールトは out_token_0 / out_token_1 を送信します(総額。ユーザーは Token-2022 転送フィーを差し引いた額を受け取ります)。

SwapBaseInput

正確な入力スワップ。 引数
アカウント 順序は 入力 → 出力 で、ユーザーの方向によります。プールの正規 token_0 / token_1 ではありません。プログラムはミントをマッチングすることでどのボールトがどれかを判断します。 数学products/cpmm/math を参照してください。 前提条件
  • open_time <= now
  • pool_status はスワップを許可します。
  • どちらのミントもこの権限に対して一時停止またはフリーズされていません。
  • amount_in > 0
一般的なエラー
  • ExceededSlippageamount_out < minimum_amount_out
  • ZeroTradingTokens — トレードが 0 に丸められます。
  • NotApproved — プールは UpdatePoolStatus を介してスワップに対して一時停止されています。
  • InvalidInput — ミントがプールのボールトミントのいずれとも一致しません。

SwapBaseOutput

正確な出力スワップ。 引数
アカウントSwapBaseInput と同じ。 数学 — 逆曲線と天井、products/cpmm/math を参照してください。 一般的なエラーExceededSlippagegross_in > max_amount_in)、ZeroTradingTokensInvalidInputNotApproved

CollectProtocolFee

ボールトから宛先にプロトコルフィーを回収します。 引数 — なし。 アカウント 効果
曲線の有効残高に変更なし(蓄積されたフィーはすでに除外されていました)。 一般的なエラー — 署名者が amm_config.protocol_owner でもプログラム管理者でもない場合は InvalidOwner6001)。(このパスに NotApproved はありません。)

CollectFundFee

CollectProtocolFee と同じ形状ですが、amm_config.fund_owner(またはここでもプログラム管理者)によって署名され、fund_fees_* カウンターをゼロにします。誤った署名者では同じ InvalidOwner になります。

CollectCreatorFee

pool_state.pool_creator によって署名されます。完全な creator_fees_token_0creator_fees_token_1 残高をクリエイターのトークンアカウントに転送し、両方のカウンターをゼロにします。両方のカウンターがゼロの場合、NoFeeCollect を返します。

CollectCreatorFeePermissionless

誰でもクリエイターフィー回収をトリガーできます。命令は常に完全な蓄積残高を pool_state.pool_creator が所有する正規関連トークンアカウントに送信します。呼び出し元は別のクリエイターまたは宛先を選択できません。どちらかの ATA が不足している場合、ペイヤーがその作成に資金を提供します。 元の CollectCreatorFee は呼び出し可能なままなので、既存のクライアントは互換性を保ちます。 引数 — なし。 アカウント 効果
  • すべての creator_fees_token_0creator_fees_token_1 をプールボールトからクリエイター ATA に転送します。
  • 両方のクリエイターフィーカウンターをゼロにし、pool_state.recent_epoch を更新します。
  • 両方のカウンターがゼロの場合、NoFeeCollect を返します。

UpdatePoolStatus

プール上の個別の操作を一時停止または再開します。status フィールドはビットマスクです: 引数
アカウント 管理者キーは プログラムにコンパイルされた 公開鍵(crate::admin::ID)であり、BPF アップグレード権限ではありません — 変更するにはプログラムのアップグレードが必要です。値については reference/program-addresses、誰が保持しているかについては security/admin-and-multisig を参照してください。

CreateAmmConfig

新しいフィーティアを作成します。 引数
アカウント 前提条件
  • 同じ index を持つ既存の AmmConfig がありません。
  • protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE
2026-09 で変更:新しいコンフィグのフィー所有者は署名者から取得されなくなりました。 create_amm_config は、管理者署名者のキーを両方にコピーする代わりに、プログラムのハードコードされた protocol_fee_owner::IDprotocol_owner に、fund_fee_owner::IDfund_owner に書き込むようになりました。アドレスは reference/program-addresses にあります。結果:新しく作成された AmmConfig の手数料は、管理者のウォレットではなく専用の手数料ウォレットに入ります。管理者は回収の 署名者 としては引き続き受け付けられます — CollectProtocolFee / CollectFundFeeamm_config.protocol_owner / fund_owner または crate::admin::ID を受け付けます — したがってスイープのために何かをローテーションする必要はありません。変わったのは、デフォルトで収益がどこへ行くかだけです。既存の AmmConfig アカウントは書き直されません — それらに保存されているものが引き続き支配するため、常にアカウントから protocol_owner / fund_owner を読み取り、どちらかの値を想定しないでください。UpdateAmmConfig パラメータ 34 は引き続きそれらをローテーションします。

UpdateAmmConfig

既存の AmmConfig のフィー率または所有権を変更します。param: u8(更新するフィールド)と value: u64 を取ります。完全なディスパッチ テーブル:
  • param = 0trade_fee_ratetrade_fee_rate + creator_fee_rate < 1_000_000 をアサート)
  • param = 1protocol_fee_rate≤ 1_000_000 および + fund_fee_rate ≤ 1_000_000 をアサート)
  • param = 2fund_fee_rate≤ 1_000_000 および + protocol_fee_rate ≤ 1_000_000 をアサート)
  • param = 3protocol_owner。新しいキーは value には 入りませんremaining_accounts[0] として追加してください(読み取り専用で構いません)。デフォルトの公開鍵であってはならず、アカウントを省略すると unwrap() でパニックします。
  • param = 4fund_owner3 と同じ仕組みです。
  • param = 5create_pool_fee
  • param = 6disable_create_pool(ゼロ以外の value はすべて無効化します)
  • param = 7creator_fee_ratecreator_fee_rate + trade_fee_rate < 1_000_000 をアサート)
それ以外の paramInvalidInput を返します。 変更は管理者によって署名され、次のスワップで このコンフィグにバインドされたすべてのプール に影響します。マイグレーションなし。プールは単に新しい値を読み取ります。

CollectExcessLamports

CPMM が制御するアカウント上の家賃免除最小値を超えるラムポートの管理者スイープ。2026-09 アップグレードで追加されたため、プロトコルは SIMD-0437 家賃削減 が各ステップの前に作成されたアカウントに残す過剰資金を回収できます。 超過分のみが移動します。トークン残高、アカウントデータ、所有者、プール状態、曲線は変更されず、命令は既に最小値にあるアカウントに対しては no-op です — したがって、各ロールアウトステップ後に再実行しても安全です。 引数 — なし。 アカウント 各ソースアカウントの処理方法 プログラムはソースアカウントの owner でディスパッチします: 無制限の remaining_accounts リストを取るため、トランザクションサイズが実際の制限です — solana-fundamentals/rent-and-reclaimable-rent で説明されているウォレット側スイープと同じ制約です。 一般的なエラーInvalidOwner6001、間違った署名者)、LamportsCalculateError6015、wSOL ラウンドトリップがゼロに正味化されなかった)、プログラム所有パスから InsufficientFunds(アカウントが独自の家賃最小値より少ない場合)。 SDK ビルダーなし。 @raydium-io/raydium-sdk-v2 はこの命令のビルダーを出荷していません。raydium-sdk-V2-demo リポジトリも同様です — これは管理者パスです。手動でエンコードしてください。solana-fundamentals/rent-and-reclaimable-rent のウォレット側スイープがトークンプログラム命令に対して行うのと同じ方法で。

状態変化マトリックス

次のステップ

ソース: