所有文章 > 日积月累 > Raydium API 使用说明
Raydium API 使用说明

Raydium API 使用说明

Raydium 是 Solana 区块链上首个去中心化自动做市商(AMM),它利用 Solana 的高效性和低成本性,为用户提供快速交易和共享流动性的平台。在本文中,我们将详细探讨如何使用 Raydium API,包括其安装、功能实现和常见问题解答。

安装 Solana 钱包适配器

为了开始使用 Raydium API,首先需要安装 Solana 钱包适配器。Solana 区块链上有多种钱包可供选择,而 Solana 钱包适配器则是处理钱包连接的理想工具。可以通过 Solana 钱包适配器官网 获取详细的安装指南。

在安装过程中,需要确保系统环境中安装了正确版本的 Node.js。如果遇到依赖项安装问题,通常可以通过检查 Node 版本来解决。在 webpack.config.js 中,可以通过添加如下的后备资源来解决兼容性问题:

resolve: {
fallback: {
"crypto": require.resolve("crypto-browserify"),
"stream": require.resolve("stream-browserify"),
"os": require.resolve("os-browserify/browser"),
}
}

钱包适配器安装界面

使用你选择的库构建 UI

在构建用于与 Raydium 交互的应用程序时,可以选择使用已有的 UI 框架。例如,可以复用之前在 React 中构建的 ETH Swap 项目中的代码。主要的 UI 代码可以在 此文件 中找到。

在构建 UI 时,可以根据个人需求修改项目外观,以提升用户体验。

获取代币余额

在 Raydium 中,获取用户的代币余额是进行交易的基础步骤。对于 SOL 和其他代币(如 RAY),获取余额的过程有所不同。

获取 SOL 余额

可以使用 Solana 提供的 useConnectionuseWallet hook 来获取 SOL 的余额:

import { useConnection, useWallet } from '@solana/wallet-adapter-react';
import { LAMPORTS_PER_SOL } from '@solana/web3.js';
const { publicKey } = useWallet();
const { connection } = useConnection();
const [solBalance, setSolBalance] = useState(0);
// ...
if (publicKey !== null) {
  const balance = await connection.getBalance(publicKey);
  setSolBalance(balance / LAMPORTS_PER_SOL);
}

获取 RAY 代币余额

对于 RAY 代币,需要使用 getTokenAccountsByOwner 函数来检索用户的所有代币账户,并通过特定的 RAY 代币地址获取余额:

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

const { publicKey } = useWallet();
const { connection } = useConnection();
const RAY_TOKEN_MINT = '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R';
const [rayBalance, setRayBalance] = useState(0);
// ...
if (publicKey !== null) {
  // get all token accounts
  const tokenAccs = await getTokenAccountsByOwner(connection, publicKey as PublicKey);
  let rayTokenAddress: PublicKey;
  tokenAccs.filter(acc => acc.accountInfo.mint.toBase58() === RAY_TOKEN_MINT).map(async (acc) => {
    rayTokenAddress = acc.pubkey;
    const accBalance = await connection.getTokenAccountBalance(rayTokenAddress);
    const rayBal = accBalance.value.uiAmount || 0;
    setRayBalance(rayBal);
  });
}

获取流动性池信息

流动性池信息是进行代币交换的重要数据,可以从 Solscan 获取流动性代币的信息,并使用 Raydium 提供的 API 来获取池信息。

import { jsonInfo2PoolKeys, LiquidityPoolJsonInfo, LiquidityPoolKeys } from "@raydium-io/raydium-sdk";
const RAY_SOL_LP_V4_POOL_KEY = '89ZKE4aoyfLBe2RuV6jM3JGNhaV18Nxh8eNtjRcndBip';
const RAYDIUM_LIQUIDITY_JSON = 'https://api.raydium.io/v2/sdk/liquidity/mainnet.json';
const [raySolPoolKey, setRaySolPoolKey] = useState();
// ...
const getPoolInfo = async () => {
  // fetch the liquidity pool list
  const liquidityJsonResp = await fetch(RAYDIUM_LIQUIDITY_JSON);
  if (!(await liquidityJsonResp).ok) return []
  const liquidityJson = await liquidityJsonResp.json();
  const allPoolKeysJson = [...(liquidityJson?.official ?? []), ...(liquidityJson?.unOfficial ?? [])]
  // find the liquidity pair 
  const poolKeysRaySolJson: LiquidityPoolJsonInfo = allPoolKeysJson.filter((item) => item.lpMint === RAY_SOL_LP_V4_POOL_KEY)?.[0] || null;
  // convert the json info to pool key using jsonInfo2PoolKeys
  const raySolPk = jsonInfo2PoolKeys(poolKeysRaySolJson);
  setRaySolPoolKey(raySolPk);
}

使用矿池密钥计算出金额

在获取流动性池信息后,可以使用矿池密钥来计算兑换所需的最低金额。可以使用 Raydium SDK 中的 Liquidity.fetchInfoLiquidity.computeAmountOut 方法来获取价格和最低金额。

进行兑换交易并发送

在计算出交易金额后,可以使用 Liquidity.makeSwapTransaction 方法生成交易,并通过 sendTransaction 发送交易请求。

import { Liquidity } from "@raydium-io/raydium-sdk";
import { useConnection, useWallet } from '@solana/wallet-adapter-react';
import { calcAmountOut } from '../utils';
const { publicKey, sendTransaction } = useWallet();
const { connection } = useConnection();
// ...
const { amountIn, minAmountOut } = await calcAmountOut(connection, raySolPoolKey, inputNumber, swapInDirection);
const { transaction, signers } = await Liquidity.makeSwapTransaction({
  connection,
  poolKeys: raySolPoolKey,
  userKeys: {
    tokenAccounts,
    owner: publicKey,
  },
  amountIn,
  amountOut: minAmountOut,
  fixedSide: "in"
});
const txid = await sendTransaction(transaction, connection, { signers, skipPreflight: true });
console.log(https://solscan.io/tx/${txid});

常见问题解答

FAQ

  1. 问:Raydium API 的主要用途是什么?

    • 答:Raydium API 主要用于在 Solana 区块链上实现去中心化代币交换和流动性管理。
  2. 问:如何获取 Raydium 的流动性池信息?

    • 答:可以通过 Raydium 提供的 API,结合流动性池的代币地址,从 Solscan 获取详细的流动性池信息。
  3. 问:在进行代币交换时需要注意什么?

    • 答:在进行代币交换时,需要确保钱包中有足够的 SOL 来支付交易费用,并确认兑换金额和滑点设置。
  4. 问:为什么我的交易没有成功?

    • 答:可能原因包括网络拥堵、余额不足或滑点设置不当。建议检查交易设置并重试。
  5. 问:如何提高 Raydium 交易的成功率?

    • 答:可以通过增加 SOL 余额、减少滑点、选择合适的交易时间来提高交易成功率。

通过本文,您可以更好地理解和使用 Raydium API 来实现去中心化交易和流动性管理。请确保在操作前详细了解所有步骤,并在必要时寻求专业建议。

#你可能也喜欢这些API文章!