如何监控 Raydium 流动性池
在传统金融中,买家和卖家通过集中市场为资产提供流动性。去中心化金融(DeFi)则使用流动性池。流动性池是智能合约,允许用户在去中心化交易所和其他 DeFi 平台上买卖加密货币。通过监控流动性池,您可以跟踪给定资产的表现,并就何时购买、出售或交换做出明智的决定。监控新流动性池的创建还可以帮助您发现最近推出的代币。
本文将介绍两种监控流动性池的方法:webhooks 和 websockets。我们还将学习如何设置 webhook 和 websocket 来监听流动性池中发生的事件。在深入了解该平台的工作原理之前,您需要一个 Helius API 密钥。通过Helius Dashboard即可轻松获得。使用您的 GitHub、Solana 钱包或 Google 帐户进行注册,然后导航至左侧边栏中的 API 密钥部分。
通过Webhook
要通过 Webhook 进行构建,我们需要遵循三个高级步骤。首先,我们将设置一个 Cloudflare Worker。其次,我们将设置一个 Helius Webhook 并添加 Cloudflare Worker 的 URL。每次监听到流动性池中的交易时,Webhook 都会触发工作线程。最后,我们将编辑工作组的代码来处理此通知并记录响应。
设置 Cloudflare Worker
我们将设置一个由我们的 webhook 触发的工作线程。我们将向工作线程添加代码来处理从 webhook 接收到的触发器。Cloudflare Workers,让我们部署无服务器代码。登录或注册Cloudflare网站,然后从主页左侧面板中选择Workers & Pages 。
单击创建 应用程序按钮。
接下来,单击“创建工作”。
现在,点击部署。
工作组已成功部署。请复制工作组链接,因为它将用于设置我们的 webhook
设置 Webhook
我们将监控Raydium,这是第一个基于 Solana 构建的 AMM,利用完全去中心化的中央限价订单簿。中央限价订单簿是股票世界中的一种交易所式执行方法标准,它根据价格和时间优先级匹配所有买价和卖价。去中心化中央限价订单簿(CLOB)是一种在分布式节点网络而不是中央实体上运行的交易系统。
我们将使用 Helius 创建一个 Webhook。 Webhooks 允许您监听链上事件并在这些事件发生时触发特定操作。我们将配置 webhook 以侦听给定 Raydium 流动性池中的特定交易类型。 Helius 目前支持 Raydium 的以下交易类型:
"RAYDIUM": [
"WITHDRAW_LIQUIDITY"
"ADD_LIQUIDITY"
"CREATE_POOL"
"SWAP"
]
可以使用Helius Dashboard或API 参考来创建 Webhook。要通过仪表板创建一个,请转至左侧面板中的Webhooks部分,然后单击“新建 Webhook”。然后,通过提供以下详细信息来配置 Webhook:
- 网络:主网/开发网
- Webhook 类型:要获取所需数据,请在增强型、原始或 Discord webhook 类型之间进行选择。如果您想要人类可读的数据,请选择增强型;我们将选择这个。但如果您更喜欢 Discord,则必须提交 Webhook URL,机器人将直接格式化并发送通知。如需帮助,请参阅本文,了解如何为 Discord 机器人设置 Webhook。如果您选择原始,请注意您将无法指定交易类型。
- 交易类型:选择下图所示的交易类型。您可以在此处找到程序支持的其他交易类型。
- Webhook URL:添加我们在 Cloudflare 上设置的工作程序的 URL(如果您选择了 Discord,则需要提供机器人的 Webhook URL)
- 身份验证标头:输入要传递到 Webhook 的 POST 请求的身份验证标头。请注意,这是可选的。
- 账户地址: Raydium 的 AMM 程序地址在这里:675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8。如果需要,您还可以添加多个帐户地址。您还可以包含资产的地址以对其进行监控。
单击“确认”后,您的 Webhook 将通知我们的 Cloudflare 工作组。下一步是编写适当的代码来处理通知。
在 Worker 中处理 Webhook 通知
我们需要安装Wrangler CLI来将我们的代码添加到worker中,以便它在触发时能够正确处理数据。
登录您的 Cloudflare 帐户,让 Wrangler 将您的脚本部署到 Cloudflare。打开命令提示符/终端并输入以下内容:
wrangler login
当 Wrangler 自动打开浏览器以显示 Cloudflare 的同意屏幕时,单击“允许”按钮。这将向 Wrangler 发送 API 令牌。
从通过 Cloudflare Dashboard 创建的 Worker 初始化一个新项目:
wrangler init --from-dash <worker-name>
检查Metrics部分以查找工作组的名称:
上面的命令将创建一个包含工作组的配置和代码的文件夹。接下来,将src/index.js文件中的代码替换为下面提供的代码。请务必添加您的 API 密钥。我们建议使用以下最佳实践来隐藏您的 API 密钥。
现在,我们将在我们的工作线程中使用以下代码:
const HELIUS_API_KEY = API_KEY;
const HELIUS_RPC_URL = `https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}`;
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
if (request.method === 'POST') {
const requestBody = await request.json();
console.log(requestBody[0].description);
return new Response('Logged POST request body.', { status: 200 });
} else {
return new Response('Method not allowed.', { status: 405 });
}
}
在此代码中,我们仅记录通知的描述。响应通知具有已解析的事务格式。值得注意的是,未提供价格信息等财务数据。您可以使用Jupiter和Birdeye等平台来获取财务信息。
将您的项目部署到 Cloudflare 的全球网络:
wrangler publish
代码发布成功后,我们查看一下日志。返回 Cloudflare 网站并转到日志部分:
单击开始日志流按钮。请注意,由于 Raydium 正在处理大量交易,因此会产生大量日志。稍后可以随意过滤日志以查找必要的事务通知。
您可以通过展开任何收到的日志来查看“消息”下记录的数据。
通过网络套接字
Websockets 是一种允许客户端和服务器之间进行实时数据交换的通信协议。这与传统方法不同,传统方法是客户端发送请求并等待服务器响应。使用 Websocket,连接保持打开状态,不断交换数据。我们将使用 websockets 来监控Raydium流动性池。
为了在我们的项目中实现更快的响应速度,我们将使用间歇泉增强的 transactionSubscribe 方法,该方法作为测试版功能提供。请注意,此方法仅适用于付费计划。 Geyser 增强 websocket 比标准 RPC websocket 方法更快。首先,让我们创建一个基本的 JavaScript 项目并创建一个名为websocket-test的新文件夹。然后,我们需要创建一个package.json文件。
{
"name": "websocket-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "ts-node src/index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/bn.js": "^5.1.0",
"ts-node": "^10.7.0",
"typescript": "^4.6.3"
},
"dependencies": {
"@solana/web3.js": "^1.41.3",
"dotenv": "^16.0.0"
}
}
创建一个名为 src 的文件夹并添加一个名为index.js的文件。将以下代码复制并粘贴到文件中,将<your-api-key>替换为您自己的 Helius API 密钥。
const WebSocket = require('ws');
// Function to send a request to the WebSocket server
function sendRequest(ws) {
const request = {
jsonrpc: "2.0",
id: 420,
method: "transactionSubscribe",
params: [{
failed: false,
accountInclude: ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"]
},
{
commitment: "processed",
encoding: "base64",
transactionDetails: "full",
showRewards: true,
maxSupportedTransactionVersion: 0
}
]
};
ws.send(JSON.stringify(request));
}
function websocketHandler() {
// Create a WebSocket connection
let ws = new WebSocket('wss://atlas-mainnet.helius-rpc.com?api-key=<your-api-key>');
// Define WebSocket event handlers
ws.on('open', function open() {
console.log('WebSocket is open');
sendRequest(ws); // Send a request once the WebSocket is open
});
ws.on('message', function incoming(data) {
const messageStr = data.toString('utf8');
console.log('Received:', messageStr);
});
ws.on('error', function error(err) {
console.error('WebSocket error:', err);
});
ws.on('close', function close() {
console.log('WebSocket is closed');
// connection closed, discard old websocket and create a new one in 5s
ws = null
setTimeout(startWebsocket, 5000)
});
}
websocketHandler();
我们在请求的accountIninclude数组参数中添加了Raydium的AMM程序地址675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 。您可以添加适当的参数来获取所需的数据。
该代码连接到 websocket 并在控制台中记录整个响应。 Websocket 在大约 5 分钟不活动后关闭。为了防止这种情况,在onClose处理程序中添加了重新连接逻辑。
在命令提示符/终端中运行此命令:
npm install && npm start
您将开始在控制台中看到如下日志:
结论
就是这样!设置 Webhook 来监控流动性池非常简单。或者,您可以使用 geyser 增强型 websocket 方法来获得更快的响应速度。完成设置后,您可以构建合适的前端来显示数据。您可以使用带有geyser RPC插件的专用节点来实现速度更快的专用连接。如果您遇到任何问题或需要帮助,请随时与我们联系!