在去中心化交易所(DEX)中,及时掌握新流动性池的创建动态对交易者和开发者都至关重要。本文将详细介绍如何通过监听 Solana 链上 Raydium DEX V4 的程序日志,实时捕捉新流动性池的创建事件,并解析相关交易信息获取代币数据和池子详情。
理解监控的基本原理
Raydium 作为 Solana 生态中重要的自动化做市商(AMM),其 V4 版本的流动性池创建会通过特定的交易指令在链上留下记录。监控这些事件的核心在于识别并解析包含初始化方法的相关交易。
核心监控思路
实现监控主要分为两个关键步骤:
- 监听 Raydium Liquidity Pool V4 的程序日志,过滤出包含
initialize2方法的交易。 - 解析这些交易,提取出流动池的详细信息,包括配对代币、数量以及开盘时间等。
实施监控的具体步骤
准备工作:引入必要的依赖库
在开始编写监控脚本前,需要确保你的项目已经安装了以下必要的 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);解码后的数据包含:
opentime: 池子的计划开盘时间(可能是0表示立即开盘,或是一个Unix时间戳)。initPcAmount: 初始化时投入的代币B的数量(原始值,未考虑精度)。initCoinAmount: 初始化时投入的代币A的数量(原始值,未考虑精度)。
格式化并输出结果
最后,将获取到的信息进行格式化处理并输出,以便于阅读和分析。
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); // 以表格形式清晰展示代币信息应用场景与进阶思考
掌握此方法后,你可以构建实时监控系统,用于:
- 早期项目发现:第一时间发现新上线的代币和流动性池。
- 数据分析:统计新池子的创建频率、初始流动性规模等市场数据。
- 自动化策略:与其他API(如DEX Screener)结合,开发自动化的交易或警报策略。
需要注意的是,解析逻辑基于当前Raydium V4的程序实现,若程序升级,账户索引或指令数据结构可能发生变化,需要及时调整代码。
常见问题
为什么要监控 Raydium 的新流动性池?
监控新池子可以帮助投资者和交易者发现最新的交易机会,了解市场最新动向,对于量化策略和市场分析至关重要。
除了代币名称和数量,还能获取哪些信息?
通过类似的方法,你可以进一步解析交易,获取创建者地址、手续费设置等信息,甚至可以监听添加流动性的后续操作。
RPC 节点连接失败或速率受限怎么办?
稳定的 RPC 连接是监控的基础。你可以使用私人 RPC 节点、付费的节点服务提供商,或者使用多个 RPC 端点并设置故障转移机制来保证服务的稳定性。
此方法是否适用于其他 DEX?
基本思路是通用的,即监听特定程序的日志并解析交易。但具体的程序地址、指令判别方法和数据解析逻辑需要根据目标 DEX(如 Orca、Serum 等)的协议规范进行调整。
计划开盘时间 opentime 为 0 是什么意思?
opentime 字段为 0 通常表示该流动性池在创建后立即开放交易,没有延迟开盘的设置。如果是一个未来的时间戳,则代表池子将在该指定时间点才允许进行交易。