关键词:Raydium SDK、Solana、AMM、去中心化互换、流动性池、React 前端、钱包适配器
想在 Solana 链上快速实现「交易即应用」?本篇 Raydium SDK 简明教程从钱包接入、代币余额查询到交易撮合,一次讲透核心流程,即使 Web3 新手也能复制粘贴跑通。以下示例完全跑在主网,Gas 低到忽略不计,创意灵感任你发挥。
安装 Solana 钱包适配器 —— 一键连上 6 大主流钱包
Solana 的 DEX 用户早已养成「多钱包待命」的习惯。推荐使用官方的 Solana Wallet Adapter ,10 行代码即可接入 Phantom、Solflare、Glow 等⼿机与浏览器插件。
安装依赖
npm i @solana/wallet-adapter-react \ @solana/wallet-adapter-wallets \ @solana/wallet-adapter-base在
App.tsx中注册钱包const wallets = useMemo( () => [ new PhantomWalletAdapter(), new GlowWalletAdapter(), new SlopeWalletAdapter(), new SolflareWalletAdapter({ network }), new TorusWalletAdapter(), ], [network] );- 弹窗即连,所有钱包展示在同一界面,瞬时提升转化率。
小贴士
- Node ≥16,避免
@solana/web3.js编译错误。 如用自建 React/Webpack,在
resolve.fallback加:fallback: { crypto: require.resolve('crypto-browserify'), stream: require.resolve('stream-browserify'), os : require.resolve('os-browserify/browser'), }
设计你的互换界面 —— Bootstrap 5 + React 组件化复用
参考开源项目的 UI 基于 Bootstrap 的互换模板,迅速整合到 Raydium 场景。核心交互在 Main.tsx 中,可读性高、二次开发易。
主要控件:
- TokenButton:可切换 SOL/TOKEN
- InputAmount:格式化数值,防止滑点
- RateDisplay:实时汇率动画
读取代币余额的两个姿势
查询原生 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);雷区提示
- 主网开练时代币都是真钱,开发者钱包最好仅放少量 SOL。
official/unOfficial字段更新频繁,缓存 15 秒即可。
用 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 %
});- PriceImpact 决定你是否主动接受「滑点挑战」。想要再深挖价格冲击?👉 深入理解 AMM 滑点研究。
一键提交交易 —— 秒级上链浏览器可追
生成交易与签名两步走:
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);至此,最简交换功能跑通。之后可叠加:
- 一键切换「买入 / 卖出」方向
- 汇率条状闪动提醒
- 24 h 交易历史侧栏
常见问题解答(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 双挖、可组合杠杆,都可基于本文代码骨架扩展。
免责声明:文中代码仅作教学示范,不构成投资建议。加密资产波动剧烈,请在充分研究后谨慎决策。