新消息:Helius 收购 Light Protocol
如何监控 Raydium 流动性池
博客/开发

如何监控 Raydium 流动性池

开发者体验工程师X 上的 Anam AnsariLinkedIn 上的 Anam Ansari
阅读需 7 分钟
目录

    在传统金融中,买卖双方通过中心化市场为资产提供流动性。去中心化金融(DeFi)则使用流动性池。流动性池是一类智能合约,允许用户在去中心化交易所和其他 DeFi 平台上买卖加密货币。通过监控流动性池,你可以跟踪特定资产的表现,并据此判断何时买入、卖出或兑换。监控新流动性池的创建,还能帮助你发现近期发行的代币。

    本文将介绍两种监控流动性池的方法:webhook 和 WebSocket。我们还将学习如何设置 webhook 和 WebSocket,以监听流动性池中发生的事件。在深入了解平台的工作方式之前,你需要一个 Helius API 密钥。你可以通过 Helius 控制面板轻松获取。使用 GitHub、Solana 钱包或 Google 账户注册,然后前往左侧边栏中的 API Keys 部分。

    通过 webhook

    要通过 webhook 构建监控功能,我们需要完成三个主要步骤。首先,设置一个 Cloudflare Worker。其次,设置 Helius webhook,并添加 Cloudflare Worker 的 URL。每当监听到流动性池中的交易时,webhook 都会触发该 Worker。最后,修改 Worker 的代码以处理此通知并记录响应。

    设置 Cloudflare Worker

    我们将设置一个由 webhook 触发的 Worker,并向其中添加代码,以处理 webhook 发来的触发请求。Cloudflare Workers 让我们能够部署无服务器代码。登录或注册 Cloudflare 网站,然后从主页左侧面板中选择 Workers & Pages。

    ‍点击 创建****应用程序按钮。

    ‍接下来,点击创建 Worker。

    ‍现在,点击部署。

    ‍Worker 已成功部署。请复制 Worker 链接,后续设置 webhook 时会用到它。

    设置 webhook

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

    我们将使用 Helius 创建 webhook。webhook 允许你监听链上事件,并在事件发生时触发特定操作。我们会配置 webhook,让它监听指定 Raydium 流动性池中的特定交易类型。Helius 目前支持 Raydium 的以下交易类型: 

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

    你可以使用 Helius 控制面板或 API 参考文档创建 webhook。要通过控制面板创建,请前往左侧面板中的 Webhooks 部分,然后点击新建 Webhook。

    然后提供以下详细信息来配置 webhook:

    1. 网络: Mainnet/Devnet
    2. Webhook 类型:根据所需数据,在 Enhanced、Raw 或 Discord webhook 类型中进行选择。如果需要易于阅读的数据,请选择 Enhanced;我们将使用这一类型。如果选择 Discord,则必须提交 Webhook URL,机器人会直接设置通知格式并发送通知。如需帮助,请参阅这篇文章,了解如何为 Discord 机器人设置 webhook。如果选择 Raw,请注意你将无法指定交易类型。
    3. 交易类型: 选择下图所示的交易类型*。* 你可以在此处查看程序支持的其他交易类型。 
    4. Webhook URL: 添加我们在 Cloudflare 上设置的 Worker URL(如果选择了 Discord,则需要提供机器人的 Webhook URL)
    5. 身份验证标头: 输入一个身份验证标头,将其传入 webhook 的 POST 请求。此项为可选设置。
    6. 账户地址: Raydium 的 AMM 程序地址为:675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8。如有需要,你也可以添加多个账户地址。还可以添加资产地址以监控这些资产。 

    点击**确认,**后,webhook 就会向我们的 Cloudflare Worker 发送通知。

    下一步是编写相应代码来处理通知。

    在 Worker 中处理 webhook 通知

    我们需要安装 Wrangler CLI,以便将代码添加到 Worker 中,使其在触发时能够正确处理数据。

    登录你的 Cloudflare 账户,以允许 Wrangler 将脚本部署到 Cloudflare。

    打开命令提示符或终端,然后输入以下内容:

    代码
    wrangler login

    当 Wrangler 自动打开浏览器并显示 Cloudflare 的授权页面时,点击允许按钮。系统会向 Wrangler 发送一个 API Token。‍

    使用通过 Cloudflare 控制面板创建的 Worker 初始化新项目:

    代码
    wrangler init --from-dash <worker-name>

    查看指标部分,找到 Worker 的名称:

    ‍上述命令会创建一个包含 Worker 配置和代码的文件夹。接下来,将 src/index.js 文件中的代码替换为下方提供的代码。请务必添加你的 API 密钥。建议遵循以下最佳实践来隐藏 API 密钥。

    现在,我们将在 Worker 中使用以下代码:

    代码
    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 网站,然后前往日志部分:

    ‍点击开始日志流按钮。

    ‍展开任意收到的日志,即可在 “message” 下查看记录的数据。

    通过 WebSocket

    WebSocket 是一种通信协议,可让客户端与服务器实时交换数据。它不同于客户端发送请求后等待服务器响应的传统方式。使用 WebSocket 时,连接会保持打开并持续交换数据。我们将使用 WebSocket 监控 Raydium 流动性池。

    为了让项目获得更快的响应速度,我们将使用 geyser 增强版 transactionSubscribe 方法,该方法目前作为测试版功能提供。请注意,此方法仅适用于 Business 或 Professional 计划。 Geyser Enhanced 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();

    我们已将 Raydium 的 AMM 程序地址 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 添加到请求的 accountInclude 数组参数中。你可以添加适当的参数来获取所需数据。 

    该代码会连接到 WebSocket,并在控制台中记录完整响应。WebSocket 会在大约 ~5 分钟无活动后关闭。为防止这种情况,我们在 onClose 处理程序中添加了重新连接逻辑。 

    在命令提示符或终端中运行以下命令: 

    代码
    npm install && npm start

    你会开始在控制台中看到类似以下内容的日志:

    总结

    就是这样!设置 webhook 来监控流动性池非常简单。你也可以使用 geyser 增强版 WebSocket 方法来获得更快的响应速度。完成设置后,可以构建合适的前端来展示数据。你还可以使用配备 geyser RPC 插件的专用节点,获得速度更快的专用连接。如果遇到任何问题或需要帮助,请随时通过 Discord 联系我们!

    请务必在下方输入你的电子邮箱地址,以免错过 Solana 的任何最新动态。准备好深入探索了吗?立即阅读 Helius 博客上的最新文章,继续你的 Solana 之旅。

    资源

    ‍

    订阅 Helius

    及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新

    放大图片