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.
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
このスクリプトの役割。 指定した 2 つのミント用の新しい CPMM プールを作成し、0.25% のフィー層を選択して、シード額で示唆される価格で初期リクイディティを供給し、新しいプール ID とトランザクション署名を出力します。
セットアップ
クイックスタートの前提条件を読んで、RPC_URL、KEYPAIR、および必要な依存関係がインストールされていることを確認してください。
また、ウォレットに両方のミントのシード額と、ワンタイムのプール作成フィー(メインネットでは約 0.15 SOL、現在の値は reference/program-addresses を参照)をカバーするのに十分な SOL でファンドする必要があります。
スクリプト
create-cpmm.mjs として保存します:
// create-cpmm.mjs
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import {
Raydium,
TxVersion,
CREATE_CPMM_POOL_PROGRAM,
CREATE_CPMM_POOL_FEE_ACC,
} from "@raydium-io/raydium-sdk-v2";
import BN from "bn.js";
import fs from "node:fs";
// ── Config from env ──────────────────────────────────────────────
const RPC_URL = process.env.RPC_URL ?? "https://api.mainnet-beta.solana.com";
const KEYPAIR = process.env.KEYPAIR ?? `${process.env.HOME}/.config/solana/id.json`;
const MINT_A = process.env.MINT_A; // required, base58
const MINT_B = process.env.MINT_B; // required, base58
const AMOUNT_A = process.env.AMOUNT_A; // required, integer raw units
const AMOUNT_B = process.env.AMOUNT_B; // required, integer raw units
if (!MINT_A || !MINT_B || !AMOUNT_A || !AMOUNT_B) {
console.error("Set MINT_A, MINT_B, AMOUNT_A, AMOUNT_B env vars.");
process.exit(1);
}
// ── Setup ────────────────────────────────────────────────────────
const connection = new Connection(RPC_URL, "confirmed");
const owner = Keypair.fromSecretKey(
new Uint8Array(JSON.parse(fs.readFileSync(KEYPAIR, "utf8"))),
);
const raydium = await Raydium.load({
owner,
connection,
cluster: "mainnet",
disableFeatureCheck: true,
blockhashCommitment: "finalized",
});
// ── Pick the 0.25% fee tier ─────────────────────────────────────
const feeConfigs = await raydium.api.getCpmmConfigs();
const feeConfig = feeConfigs.find((c) => c.index === 0);
if (!feeConfig) throw new Error("0.25% fee tier not found in CPMM configs.");
// ── Resolve mint metadata (Token-2022-aware) ────────────────────
const mintA = await raydium.token.getTokenInfo(new PublicKey(MINT_A));
const mintB = await raydium.token.getTokenInfo(new PublicKey(MINT_B));
// ── Build and execute ───────────────────────────────────────────
const { execute, extInfo } = await raydium.cpmm.createPool({
programId: CREATE_CPMM_POOL_PROGRAM,
poolFeeAccount: CREATE_CPMM_POOL_FEE_ACC,
mintA,
mintB,
mintAAmount: new BN(AMOUNT_A),
mintBAmount: new BN(AMOUNT_B),
startTime: new BN(0), // open immediately
feeConfig,
associatedOnly: false,
ownerInfo: { useSOLBalance: true },
txVersion: TxVersion.V0,
computeBudgetConfig: {
units: 600_000,
microLamports: 100_000,
},
});
const { txId } = await execute({ sendAndConfirm: true });
console.log(`Pool ID: ${extInfo.address.poolId.toBase58()}`);
console.log(`LP mint: ${extInfo.address.lpMint.toBase58()}`);
console.log(`Vault A: ${extInfo.address.vaultA.toBase58()}`);
console.log(`Vault B: ${extInfo.address.vaultB.toBase58()}`);
console.log(`Tx: https://solscan.io/tx/${txId}`);
実行する
例:1 SOL と 160 USDC をシードとして SOL/USDC プールを作成します:
export MINT_A="So11111111111111111111111111111111111111112" # wSOL
export MINT_B="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" # USDC
export AMOUNT_A="1000000000" # 1 SOL (9 decimals)
export AMOUNT_B="160000000" # 160 USDC (6 decimals)
node create-cpmm.mjs
予想される出力:
Pool ID: HgC5...3kXb
LP mint: 4ZAS...9rkV
Vault A: J9Mu...mP2k
Vault B: AaJq...8wxx
Tx: https://solscan.io/tx/5dQ...
何が起きたのか
getCpmmConfigs が api-v3.raydium.io からライブのフィー層リストを取得し、インデックス 0(0.25% 層 — reference/fee-comparison で完全なセットを確認)を選択しました。
getTokenInfo が各ミントのメタデータを解決し、どのトークンプログラムがそれを所有しているかを含めます。CPMM は SPL Token と Token-2022 の両方のミントを受け入れ、SDK が自動的にルーティングします。
createPool が 1 つのトランザクションを構築して:
- ミントを正規の順序にソートし、
- プール PDA、ボールト、LP ミント、および権限を導出し、
- ワンタイムの
create_pool_fee を CREATE_CPMM_POOL_FEE_ACC に支払い、
- 必要に応じて呼び出し元の ATA を作成し、
AMOUNT_A と AMOUNT_B でボールトをシードします。
- 初期価格はシード比率で設定されます:小数点調整後、
price = AMOUNT_B / AMOUNT_A。これは慎重に選択してください — ボットはプール開設直後のミスプライシングを数秒以内にアービトラージします。
startTime: new BN(0) で取引が即座に開始されます。本公開前にリクイディティをステージングするには、将来の Unix タイムスタンプを設定します。
よくあるエラー
pool already exists — このミント組み合わせとフィー層のプールが既に存在します。作成する前に確認してください。
insufficient funds — ウォレットに MINT_A、MINT_B、または SOL(プール作成フィー + レント)の十分な額がありません。
Token-2022 extension not supported — ミントの 1 つが CPMM が受け入れない拡張機能を使用しています。reference/token-2022-support を参照してください。
デプロイ後
新しいプールに対してすぐにスワップできます — Swap from CLI スクリプトは新しい POOL_ID を直接受け入れます。アグリゲーター(Jupiter など)は数分以内に新しいプールをインデックスします。
次のステップ