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 من RPC، يقدم سعر مبادلة بتسامح انزلاق بنسبة 0.5٪، يبني المعاملة، يوقّعها بمفتاح الوصول الخاص بك، وينفذها. من البداية إلى النهاية في حوالي 30 سطراً.
الإعداد
تأكد من أنك قرأت متطلبات البدء السريع وأن لديك RPC_URL و KEYPAIR والمكتبات المثبتة.
السكريبت
احفظه باسم swap.mjs:
// swap.mjs
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import { Raydium, TxVersion, CurveCalculator } 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 POOL_ID = process.env.POOL_ID; // required, base58
const INPUT_MINT = process.env.INPUT_MINT; // required, base58
const AMOUNT_RAW = process.env.AMOUNT_RAW; // required, integer in raw units (e.g. 1_000_000_000 for 1 SOL)
if (!POOL_ID || !INPUT_MINT || !AMOUNT_RAW) {
console.error("Set POOL_ID, INPUT_MINT, AMOUNT_RAW 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",
});
// ── Load pool ────────────────────────────────────────────────────
const { poolInfo, poolKeys, rpcData } =
await raydium.cpmm.getPoolInfoFromRpc(new PublicKey(POOL_ID));
const baseIn = poolInfo.mintA.address === INPUT_MINT;
// ── Quote ────────────────────────────────────────────────────────
const inputAmount = new BN(AMOUNT_RAW);
const swapResult = CurveCalculator.swap(
inputAmount,
baseIn ? rpcData.baseReserve : rpcData.quoteReserve,
baseIn ? rpcData.quoteReserve : rpcData.baseReserve,
rpcData.configInfo.tradeFeeRate,
);
console.log(`Quote: ${inputAmount.toString()} -> ${swapResult.destinationAmountSwapped.toString()}`);
console.log(`Fee: ${swapResult.tradeFee.toString()}`);
// ── Build and execute ────────────────────────────────────────────
const { execute } = await raydium.cpmm.swap({
poolInfo,
poolKeys,
inputAmount,
swapResult,
slippage: 0.005, // 0.5%
baseIn,
txVersion: TxVersion.V0,
computeBudgetConfig: {
units: 250_000,
microLamports: 50_000,
},
});
const { txId } = await execute({ sendAndConfirm: true });
console.log(`Swap landed: https://solscan.io/tx/${txId}`);
قم بتشغيله
اختر أي تجمع CPMM لديك سيولة له. مثال مع تجمع SOL/USDC CPMM الرسمي:
export POOL_ID="<paste a CPMM pool ID — find one in Raydium UI's Pools tab>"
export INPUT_MINT="So11111111111111111111111111111111111111112"
export AMOUNT_RAW="10000000" # 0.01 SOL
node swap.mjs
الناتج المتوقع:
Quote: 10000000 -> 1640000
Fee: 25000
Swap landed: https://solscan.io/tx/4Z9...
ما الذي حدث للتو
Raydium.load هيّأ SDK — جلب الإعدادات العامة، أعدّ سياق محفظتك.
getPoolInfoFromRpc سحب حالة التجمع الحيّة مباشرة من RPC (وليس من ذاكرة التخزين المؤقت للواجهة). للمبادلات ذات القيمة العالية، تريد دائماً حالة جديدة.
CurveCalculator.swap حسبت الناتج من منتج ثابت بخصم رسوم التجمع. هذه هي نفس الرياضيات التي يشغلها البرنامج على السلسلة، لذا يمكنك مقارنة الأسعار خارج السلسلة وعلى السلسلة.
raydium.cpmm.swap بنت المعاملة بصيغة V0 (مع تفعيل جداول البحث عن العناوين) وأضافت تكوين ميزانية الحسابات الصريح. نصيحة ميزانية الحسابات تساعد المعاملة على الهبوط في نوافذ مزدحمة.
execute({ sendAndConfirm: true }) وقّعت وأرسلت وانتظرت التأكيد.
الأخطاء الشائعة
Pool not found — POOL_ID خاطئ، أو أنت موجه نحو المجموعة الخاطئة (معرف تجمع mainnet مقابل RPC devnet، إلخ).
Insufficient funds for transaction — محفظتك لا تملك SOL كافياً لمدخل swap + الرسوم + إيجار ATA.
Slippage tolerance exceeded — تحرّكت سعر التجمع بين تقديم السعر والتنفيذ. أعد التشغيل؛ أو ارفع معامل slippage؛ أو استخدم computeAmountOut الخاص بـ SDK الذي يعيد جلب الاحتياطيات دائماً.
Token account not initialized — لم يكن ATA للرمز الناتج موجوداً وهبطت التعليمات الإنشائية الضمنية لكنها فشلت لسبب ما؛ تحقق من رصيد SOL في محفظتك وحاول مرة أخرى.
الخطوات التالية