Raydium SDK 简明教程:30 分钟在 Solana 搭建去中心化互换前端

·

关键词:Raydium SDK、Solana、AMM、去中心化互换、流动性池、React 前端、钱包适配器

想在 Solana 链上快速实现「交易即应用」?本篇 Raydium SDK 简明教程从钱包接入、代币余额查询到交易撮合,一次讲透核心流程,即使 Web3 新手也能复制粘贴跑通。以下示例完全跑在主网,Gas 低到忽略不计,创意灵感任你发挥。


安装 Solana 钱包适配器 —— 一键连上 6 大主流钱包

Solana 的 DEX 用户早已养成「多钱包待命」的习惯。推荐使用官方的 Solana Wallet Adapter ,10 行代码即可接入 Phantom、Solflare、Glow 等⼿机与浏览器插件。

  1. 安装依赖

    npm i @solana/wallet-adapter-react \
           @solana/wallet-adapter-wallets \
           @solana/wallet-adapter-base
  2. App.tsx 中注册钱包

    const wallets = useMemo(
      () => [
        new PhantomWalletAdapter(),
        new GlowWalletAdapter(),
        new SlopeWalletAdapter(),
        new SolflareWalletAdapter({ network }),
        new TorusWalletAdapter(),
      ],
      [network]
    );
  3. 弹窗即连,所有钱包展示在同一界面,瞬时提升转化率。

小贴士


设计你的互换界面 —— Bootstrap 5 + React 组件化复用

参考开源项目的 UI 基于 Bootstrap 的互换模板,迅速整合到 Raydium 场景。核心交互在 Main.tsx 中,可读性高、二次开发易。

主要控件:


读取代币余额的两个姿势

查询原生 SOL

import { useConnection, useWallet } from '@solana/wallet-adapter-react';
import { LAMPORTS_PER_SOL } from '@solana/web3.js';

const { publicKey } = useWallet();
const { connection } = useConnection();

if (publicKey) {
  const balance = await connection.getBalance(publicKey);
  setSolBalance(balance / LAMPORTS_PER_SOL);
}

查询 RAY 等 SPL

import { PublicKey } from '@solana/web3.js';

const RAY_TOKEN_MINT = '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R';
const tokenAccs = await connection.getTokenAccountsByOwner(publicKey, {
  mint: new PublicKey(RAY_TOKEN_MINT),
});

tokenAccs.value.forEach(async ({ pubkey })=> {
  const { value } = await connection.getTokenAccountBalance(pubkey);
  setRayBalance(value.uiAmount || 0);
});

获取实时流动性池信息

Raydium 将全部官方 + 第三方流动性池公开在 JSON(api.raydium.io/v2/sdk/liquidity/mainnet.json)。以下为简洁解析示例:

import { jsonInfo2PoolKeys } from '@raydium-io/raydium-sdk';

const RAY_SOL_LP = '89ZKE4aoyfLBe2RuV6jM3JGNhaV18Nxh8eNtjRcndBip';

const resp = await fetch('https://api.raydium.io/v2/sdk/liquidity/mainnet.json');
const { official, unOfficial } = await resp.json();
const all = [...official ?? [], ...unOfficial ?? []];

const poolJson = all.find(i => i.lpMint === RAY_SOL_LP);
const raySolPool = jsonInfo2PoolKeys(poolJson);

雷区提示


用 SDK 计算「滑点 + 最小收得量」

调用 Liquidity.fetchInfo 锁定实时挂单深度,再用 computeAmountOut 计算实际拿到数量:

const poolInfo = await Liquidity.fetchInfo({ connection, poolKeys: raySolPool });
const { amountOut, minAmountOut, priceImpact } = Liquidity.computeAmountOut({
  poolKeys: raySolPool,
  poolInfo,
  amountIn: new TokenAmount(SOL_TOKEN, inputAmount),
  currencyOut: RAY_TOKEN,
  slippage: 0.005, // 默认 0.5 %
});

一键提交交易 —— 秒级上链浏览器可追

生成交易与签名两步走:

const { transaction, signers } = await Liquidity.makeSwapTransaction({
  connection,
  poolKeys: raySolPool,
  userKeys: { tokenAccounts, owner: publicKey },
  amountIn,
  amountOut: minAmountOut,
  fixedSide: 'in',
});

const txSig = await sendTransaction(transaction, connection, { signers, skipPreflight: true });
console.log('成功!查看: https://solscan.io/tx/' + txSig);

至此,最简交换功能跑通。之后可叠加:


常见问题解答(FAQ)

Q1:开发网与测试网为何没有 Raydium 池?
A:官方仅部署主网,想测试需自行起流动性池或直接使用主网的少量 SOL + 0.1 USDC 体验。

Q2:在 Webpack Build 中提示 Buffer 未定义?
A:再增一行 polyfill:npm i buffer,并在 webpack.config.js 顶部引入 global.Buffer = Buffer

Q3:本地测试需要伪造代币吗?
A:可用 Solana CLI create-token 创建假代币,再围绕它新建流动性池做 Dry-Run。

Q4:如何添加「交易成功 Toast + 链接」?
A:监听 sendTransaction 产生的 txSig,用 <a href="https://solscan.io/tx/${txSig}" target="_blank">View on Solscan</a> 提升用户信任。

Q5:Gas 相较以太坊省多少?
A:平均每笔 Raydium swap ≈ 0.00025 SOL,不足 $0.003,手续费秒级确认,远高于以太坊性能。

Q6:还有哪些高级玩法?
A:0 基础上线 IDO、流动性挖矿、NFT 双挖、可组合杠杆,都可基于本文代码骨架扩展。


免责声明:文中代码仅作教学示范,不构成投资建议。加密资产波动剧烈,请在充分研究后谨慎决策。