如何监控 Solana Raydium V4 新流动性池的创建

·

在去中心化交易所(DEX)中,及时掌握新流动性池的创建动态对交易者和开发者都至关重要。本文将详细介绍如何通过监听 Solana 链上 Raydium DEX V4 的程序日志,实时捕捉新流动性池的创建事件,并解析相关交易信息获取代币数据和池子详情。

理解监控的基本原理

Raydium 作为 Solana 生态中重要的自动化做市商(AMM),其 V4 版本的流动性池创建会通过特定的交易指令在链上留下记录。监控这些事件的核心在于识别并解析包含初始化方法的相关交易。

核心监控思路

实现监控主要分为两个关键步骤:

  1. 监听 Raydium Liquidity Pool V4 的程序日志,过滤出包含 initialize2 方法的交易。
  2. 解析这些交易,提取出流动池的详细信息,包括配对代币、数量以及开盘时间等。

实施监控的具体步骤

准备工作:引入必要的依赖库

在开始编写监控脚本前,需要确保你的项目已经安装了以下必要的 JavaScript 库:

const solanaWeb3 = require('@solana/web3.js');
const splToken = require('@solana/spl-token');
const { Metadata, deprecated } = require('@metaplex-foundation/mpl-token-metadata');
const bs58 = require('bs58');
const { struct, u8, nu64 } = require('@solana/buffer-layout');

第一步:监听 Raydium V4 的程序日志

首先,你需要建立一个与 Solana 网络的连接,并指定监听 Raydium V4 的特定程序地址。

const connection = new solanaWeb3.Connection('{你的RPC节点地址}', 'confirmed');
const raydiumV4Address = '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8';
const raydiumV4PublicKey = new solanaWeb3.PublicKey(raydiumV4Address);

connection.onLogs(
  raydiumV4PublicKey,
  ({ logs, err, signature }) => {
    if (err) return;
    if (logs && logs.some(log => log.includes("initialize2"))) {
      console.log("发现 'initialize2' 交易签名:", signature);
      // 触发后续的解析函数
      fetchPoolInfo(signature, connection);
    }
  },
  "confirmed"
);

执行此代码后,控制台将开始输出所有侦测到的、包含初始化新流动性池指令的交易签名。

第二步:解析交易并提取流动池信息

获取交易签名后,下一步是获取该交易的详细数据并从中提取关键信息。

获取并解析交易数据

async function fetchPoolInfo(signature, connection) {
  const tx = await connection.getParsedTransaction(
    signature,
    {
      maxSupportedTransactionVersion: 0,
      commitment: 'confirmed'
    });

  // 查找与Raydium V4交互的指令
  const targetInstruction = tx?.transaction.message.instructions.find(ix => ix.programId.toBase58() === raydiumV4Address);
  if (!targetInstruction) return;

  const accounts = targetInstruction.accounts;
  // 关键账户的索引位置
  const LPIndex = 4;       // 流动性池账户索引
  const tokenAIndex = 8;   // 代币A的账户索引
  const tokenBIndex = 9;   // 代币B的账户索引

  const LPAccount = accounts[LPIndex];
  const tokenAAccount = accounts[tokenAIndex];
  const tokenBAccount = accounts[tokenBIndex];
}

获取代币元数据信息

要从代币账户地址获取代币名称和小数位数,需要查询链上的代币元数据。

async function fetchTokenInfo(tokenPublicKey) {
  const mintAddress = new solanaWeb3.PublicKey(tokenPublicKey);
  const mintInfo = await splToken.getMint(connection, mintAddress); // 获取代币信息(如精度)
  let metadataPda = await deprecated.Metadata.getPDA(mintAddress);
  let metdadataContent = await Metadata.fromAccountAddress(connection, metadataPda); // 获取元数据(如代币名称)
  return [metdadataContent.data.name, mintInfo.decimals];
}

// 获取两种代币的信息
const tokenAInfo = await fetchTokenInfo(tokenAAccount.toBase58());
const tokenBInfo = await fetchTokenInfo(tokenBAccount.toBase58());

解码指令数据

交易指令数据经过编码,需要使用相应的布局(Layout)进行解码,以获取初始注入的代币数量等信息。

const instructionData = bs58.decode(targetInstruction.data);

// 定义Raydium初始化指令的数据结构布局
const RAYDIUM_INSTRUCTION_LAYOUT = struct([
  u8('discriminator'),
  u8('nonce'),
  nu64('opentime'),
  nu64('initPcAmount'),
  nu64('initCoinAmount')
]);

const decodedData = RAYDIUM_INSTRUCTION_LAYOUT.decode(instructionData);

解码后的数据包含:

格式化并输出结果

最后,将获取到的信息进行格式化处理并输出,以便于阅读和分析。

console.log(`交易详情: https://solscan.io/tx/${signature}`);
console.log(`新流动性池地址: ${LPAccount.toBase58()}`);

// 计算考虑精度后的实际代币数量
const displayData = [
  {
    "代币名称": tokenAInfo[0].replace(/\x00/g, ''),
    "代币地址": tokenAAccount.toBase58(),
    "初始注入量": decodedData.initCoinAmount / Math.pow(10, tokenAInfo[1])
  },
  {
    "代币名称": tokenBInfo[0].replace(/\x00/g, ''),
    "代币地址": tokenBAccount.toBase58(),
    "初始注入量": decodedData.initPcAmount / Math.pow(10, tokenBInfo[1])
  }
];

// 如果有设定开盘时间,则输出
if (decodedData.opentime !== 0) {
  // 如需时间格式化,可引入moment库
  // const opentime = moment.unix(decodedData.opentime).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');
  console.log(`计划开盘时间(Unix时间戳): ${decodedData.opentime}`);
}

console.table(displayData); // 以表格形式清晰展示代币信息

👉 查看实时链上监控工具

应用场景与进阶思考

掌握此方法后,你可以构建实时监控系统,用于:

需要注意的是,解析逻辑基于当前Raydium V4的程序实现,若程序升级,账户索引或指令数据结构可能发生变化,需要及时调整代码。

常见问题

为什么要监控 Raydium 的新流动性池?

监控新池子可以帮助投资者和交易者发现最新的交易机会,了解市场最新动向,对于量化策略和市场分析至关重要。

除了代币名称和数量,还能获取哪些信息?

通过类似的方法,你可以进一步解析交易,获取创建者地址、手续费设置等信息,甚至可以监听添加流动性的后续操作。

RPC 节点连接失败或速率受限怎么办?

稳定的 RPC 连接是监控的基础。你可以使用私人 RPC 节点、付费的节点服务提供商,或者使用多个 RPC 端点并设置故障转移机制来保证服务的稳定性。

此方法是否适用于其他 DEX?

基本思路是通用的,即监听特定程序的日志并解析交易。但具体的程序地址、指令判别方法和数据解析逻辑需要根据目标 DEX(如 Orca、Serum 等)的协议规范进行调整。

计划开盘时间 opentime 为 0 是什么意思?

opentime 字段为 0 通常表示该流动性池在创建后立即开放交易,没有延迟开盘的设置。如果是一个未来的时间戳,则代表池子将在该指定时间点才允许进行交易。