Chuyển đến nội dung chính

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.

Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →
Điều này làm gì. Tải pool CPMM từ RPC, báo giá swap với slippage 0,5%, xây dựng giao dịch, ký bằng keypair của bạn và gửi đi. Hoàn toàn trong ~30 dòng.

Thiết lập

Hãy đảm bảo bạn đã đọc Quick start prerequisites và có RPC_URL, KEYPAIR, cùng các thư viện phụ thuộc được cài đặt.

Script

Lưu dưới dạng 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}`);

Chạy nó

Chọn bất kỳ pool CPMM nào bạn có thanh khoản. Ví dụ với pool CPMM SOL/USDC chính tắc:
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
Kết quả dự kiến:
Quote: 10000000 -> 1640000
Fee:   25000
Swap landed: https://solscan.io/tx/4Z9...

Điều gì vừa xảy ra

  1. Raydium.load khởi tạo SDK — tìm nạp cấu hình toàn cục, thiết lập ngữ cảnh ví của bạn.
  2. getPoolInfoFromRpc kéo trạng thái pool trực tiếp từ RPC (không từ bộ nhớ cache API). Đối với swap có giá trị cao, bạn luôn muốn trạng thái tươi mới.
  3. CurveCalculator.swap tính toán đầu ra constant-product sau phí của pool. Đây là toán học giống như chương trình chạy trên chuỗi, nên bạn có thể so sánh báo giá ngoài chuỗi và trên chuỗi.
  4. raydium.cpmm.swap xây dựng giao dịch với định dạng V0 (bảng tra cứu địa chỉ được bật) và thêm cấu hình compute-budget rõ ràng. Tiền tip compute-budget giúp giao dịch lên sàn trong các cửa sổ bận rộn.
  5. execute({ sendAndConfirm: true }) ký, gửi và chờ xác nhận.

Lỗi phổ biến

  • Pool not foundPOOL_ID sai, hoặc bạn trỏ đến cụm sai (ID pool mainnet so với RPC devnet, v.v.).
  • Insufficient funds for transaction — Ví của bạn không có đủ SOL cho đầu vào swap + phí + tiền thuê ATA.
  • Slippage tolerance exceeded — Giá pool thay đổi giữa báo giá và thực hiện. Chạy lại; hoặc tăng tham số slippage; hoặc sử dụng SDK’s computeAmountOut luôn lấy lại reserve.
  • Token account not initialized — ATA của token đầu ra không tồn tại và hướng dẫn tạo ngầm định đã lên nhưng không thành công vì lý do nào đó; kiểm tra số dư SOL của ví và thử lại.

Tiếp theo