الانتقال إلى المحتوى الرئيسي

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.

هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
ما يفعله هذا السكريبت. ينشئ مجمّع CPMM جديداً تماماً لعملتَي معدنيتَيْن تحددهما، ويختار فئة الرسوم 0.25%، وينشئ السيولة الأولية بالسعر المحدد بواسطة كميات البذر، ويطبع معرف المجمّع الجديد وتوقيع المعاملة.

الإعداد

تأكد من قراءتك متطلبات البدء السريع وأن لديك RPC_URL وKEYPAIR والمكتبات المطلوبة مثبّتة. ستحتاج أيضاً إلى تمويل المحفظة بكميات البذر لكلا العملتَيْن المعدنيتَيْن، بالإضافة إلى ما يكفي من SOL لتغطية رسوم إنشاء المجمّع لمرة واحدة (حوالي 0.15 SOL على الشبكة الرئيسية، انظر reference/program-addresses للقيمة الحالية).

السكريبت

احفظ باسم 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}`);

تشغيله

مثال: إنشاء مجمّع SOL/USDC مع 1 SOL و 160 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...

ما حدث للتو

  1. getCpmmConfigs استرجعت قائمة فئات الرسوم المباشرة من api-v3.raydium.io واختارت الفهرس 0 (فئة 0.25% — انظر reference/fee-comparison للمجموعة الكاملة).
  2. getTokenInfo حلّت بيانات كل عملة معدنية، بما في ذلك برنامج الرموز الذي يمتلكها. يقبل CPMM كلاً من SPL Token و Token-2022 mints؛ يوجّه SDK تلقائياً.
  3. createPool بنت معاملة واحدة تقوم بـ:
    • فرز العملات المعدنية بالترتيب الأساسي،
    • استخراج PDA للمجمّع والخزائن و LP mint والسلطة،
    • دفع create_pool_fee لمرة واحدة إلى CREATE_CPMM_POOL_FEE_ACC،
    • إنشاء ATAs الخاصة بك إذا كانت مفقودة،
    • بذر الخزائن بـ AMOUNT_A و AMOUNT_B.
  4. السعر الأولي يتم تعيينه بواسطة نسبة البذر: price = AMOUNT_B / AMOUNT_A بعد تعديل الكسور العشرية. اختر هذا بعناية — ستقوم الروبوتات بالمراجحة على أي سعر غير صحيح خلال ثوانٍ من فتح المجمّع.
  5. startTime: new BN(0) يفتح التداول على الفور. لتجميع السيولة قبل فتح التداول للجمهور، اضبط طابع زمني Unix مستقبلي.

الأخطاء الشائعة

  • pool already exists — يوجد مجمّع بالفعل لهذا الزوج من العملات المعدنية بفئة الرسوم هذه. ابحث عنه قبل الإنشاء.
  • insufficient funds — محفظتك لا تحتوي على ما يكفي من MINT_A أو MINT_B أو SOL (لرسوم إنشاء المجمّع + الإيجار).
  • Token-2022 extension not supported — تستخدم إحدى عملاتك المعدنية ملحقاً لا يقبله CPMM. انظر reference/token-2022-support.

بعد النشر

يمكنك التبديل على الفور مقابل المجمّع الجديد — يقبل سكريبت Swap من CLI معرّف المجمّع الجديد POOL_ID مباشرةً. ستقوم المجمّعات (Jupiter وغيرها) بفهرسة المجمّع الجديد في غضون دقائق.

الخطوة التالية