如何监控 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 。

Cloudflare Worker 设置

单击创建 应用程序按钮。

Cloudflare Worker 设置

接下来,单击“创建工作​”

Cloudflare Worker 设置

现在,点击部署

Cloudflare Worker 设置

工作组已成功部署。请复制工作组链接,因为它将用于设置我们的 webhook

设置 Webhook

我们将监控Raydium,这是第一个基于 Solana 构建的 AMM,利用完全去中心化的中央限价订单簿。中央限价订单簿是股票世界中的一种交易所式执行方法标准,它根据价格和时间优先级匹配所有买价和卖价。去中心化中央限价订单簿(CLOB)是一种在分布式节点网络而不是中央实体上运行的交易系统。 

我们将使用 Helius 创建一个 Webhook。 Webhooks 允许您监听链上事件并在这些事件发生时触发特定操作。我们将配置 webhook 以侦听给定 Raydium 流动性池中的特定交易类型。 Helius 目前支持 Raydium 的以下交易类型: 

"RAYDIUM": [
   "WITHDRAW_LIQUIDITY"
   "ADD_LIQUIDITY"
   "CREATE_POOL"
   "SWAP"
 ]

可以使用Helius DashboardAPI 参考来创建 Webhook。要通过仪表板创建一个,请转至左侧面板中的Webhooks部分,然后单击“新建 Webhook”。然后,通过提供以下详细信息来配置 Webhook:

  1. 网络:主网/开发网
  2. Webhook 类型:要获取所需数据,请在增强型、原始或 Discord webhook 类型之间进行选择。如果您想要人类可读的数据,请选择增强型;我们将选择这个。但如果您更喜欢 Discord,则必须提交 Webhook URL,机器人将直接格式化并发送通知。如需帮助,请参阅本文了解如何为 Discord 机器人设置 Webhook。如果您选择原始,请注意您将无法指定交易类型。
  3. 交易类型:选择下图所示的交易类型。您可以在此处找到程序支持的其他交易类型。 
  4. Webhook URL:添加我们在 Cloudflare 上设置的工作程序的 URL(如果您选择了 Discord,则需要提供机器人的 Webhook URL)
  5. 身份验证标头:输入要传递到 Webhook 的 POST 请求的身份验证标头。请注意,这是可选的。
  6. 账户地址: Raydium 的 AMM 程序地址在这里:675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8。如果需要,您还可以添加多个帐户地址。您还可以包含资产的地址以对其进行监控。 
Webhook 配置

单击“确认”后,您的 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部分以查找工作组的名称:

Cloudflare 工作人员

上面的命令将创建一个包含工作组的配置和代码的文件夹。接下来,将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 });
    }
}

在此代码中,我们仅记录通知的描述。响应通知具有已解析的事务格式。值得注意的是,未提供价格信息等财务数据。您可以使用JupiterBirdeye等平台来获取财务信息。

‍将您的项目部署到 Cloudflare 的全球网络:

wrangler publish

代码发布成功后,我们查看一下日志。返回 Cloudflare 网站并转到日志部分:

Cloudflare 工作人员

单击开始日志流按钮。请注意,由于 Raydium 正在处理大量交易,因此会产生大量日志。稍后可以随意过滤日志以查找必要的事务通知。

Cloudflare 工作日志

您可以通过展开任何收到的日志来查看“消息”下记录的数据。

Cloudflare Wroker 日志中显示的 Webhook 响应
Cloudflare Wroker 日志中显示的 Webhook 响应

通过网络套接字

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

‍您将开始在控制台中看到如下日志:

控制台收到 Websocket 响应
控制台收到 Websocket 响应

结论

就是这样!设置 Webhook 来监控流动性池非常简单。或者,您可以使用 geyser 增强型 websocket 方法来获得更快的响应速度。完成设置后,您可以构建合适的前端来显示数据。您可以使用带有geyser RPC插件的专用节点来实现速度更快的专用连接。如果您遇到任何问题或需要帮助,请随时与我们联系!