本文介绍了如何使用Shyft的gRPC服务构建一个监听Raydium上新添加流动性池的Telegram机器人。通过gRPC,可以更高效、低延迟地获取链上数据,简化开发流程,减少代码量,无需专用节点。文章详细说明了如何设置Telegram机器人,以及如何使用Shyft gRPC获取和解析Raydium上的新池信息,最后通过Telegram发送通知。
使用 Shyft 的 gRPC 构建一个监听 Raydium 上新添加的池子的机器人,可以用更少的代码和更低的延迟来实现。 通过利用 gRPC 的强大功能,开发者可以创建一个可扩展且高效的机器人,无缝集成到 Solana 区块链。 这种方法可以显著简化开发过程并减少整体代码库的大小。
我们为你创建了一个示例项目,可以跟随本文一起学习,随时点击这里克隆它。
要开始,我们需要准备一些东西。
身份验证:你的 Shyft API 密钥、gRPC 端点和 gRPC Token
你可以从 Shyft 网站 获取你自己的 Shyft API 密钥(Shyft 使用的身份验证参数)。 你也可以在你的 Shyft 仪表板 上找到你所在地区的 gRPC 端点和访问 Token。
一个服务器端后端(如 NodeJS)来接收 gRPC 数据
由于 web 浏览器不支持 gRPC 服务,你需要一个后端应用程序来接收 gRPC 数据。 在这个例子中,我们使用了 NodeJS,但也可以使用任何其他后端服务器端语言,如 C#、Go、Java、Kotlin、Python 或 PHP。
本文将指导你创建一个 Telegram 机器人,用于监听 Raydium 上新添加的池子。 总结一下,这个过程主要包括以下 3 个步骤:
4. 克隆 git 仓库
gRPC 简化了 Solana 区块链上的流式数据传输,且延迟极低。 它还消除了对专用节点的需求,从而简化了开发。 使用 gRPC,构建复杂的项目变得简单。 它的低延迟和减少的代码库彻底改变了专用节点的时代。 关键点:
构建机器人的第一步是在 Telegram 上使用 @BotFather 设置你的机器人。 这包括命名你的机器人并获取你的机器人 Token。 为此,你需要导航到 Telegram 应用程序,搜索 “botFather” ,按照提示创建一个新机器人并获取你的机器人 Token ID。 在我们的教程中,我们将使用 ‘node-telegram-bot-api’ 来构建我们的 Telegram 机器人界面。 我们需要进行一些重要的输入,包括机器人 Token ID 和聊天 ID。 要获取你的聊天 ID,你需要在你的机器人代码中使用 console.log(ctx)
命令来打印上下文对象,其中包含聊天 ID。 下面是一个如何构建代码以创建机器人并获取必要输入的示例:
const TELEGRAM_BOT_TOKEN = "YOUR BOT KEY"
const bot = new TelegramBot(TELEGRAM_BOT_TOKEN, { polling : true});
const msgId = 12345671234567 //你的机器人 msgID (数字);
bot.on('text', async(ctx) => {
const Response = console.log(ctx)
)}
克隆 git 仓库 & 安装依赖
该机器人监听 Raydium dex 上新添加的池子,但要让我们的机器人工作,我们需要克隆 git 仓库并下载依赖项
$ git clone https://github.com/Shyft-to/solana-defi.git
cd grpc-pool-monitoring
npm install
接下来我们需要进行正确的导入
import Client, {
CommitmentLevel,
SubscribeRequestAccountsDataSlice,
SubscribeRequestFilterAccounts,
SubscribeRequestFilterBlocks,
SubscribeRequestFilterBlocksMeta,
SubscribeRequestFilterEntry,
SubscribeRequestFilterSlots,
SubscribeRequestFilterTransactions,
} from "@triton-one/yellowstone-grpc";
import { SubscribeRequestPing } from "@triton-one/yellowstone-grpc/dist/grpc/geyser";
import { VersionedTransactionResponse } from "@solana/web3.js";
import { TransactionFormatter } from "./utils/transaction-formatter";
import { RaydiumAmmParser } from "./utils/raydium-amm-parser";
样板代码
通过利用 gRPC,我们可以更快地获取池子的链上数据。 这使我们能够为我们的机器人检索各种重要信息,包括:Token 地址、流动性对 Mint 地址、池子地址、Token 金库、开放时间、Token 所有者和其他相关信息。
首先我们需要发出订阅请求。
const client = new Client(
'YOUR Shyft GRPC URL ACCESS',
'YOUR X TOKEN',
undefined,
);
const req: SubscribeRequest = {
accounts: {},
slots: {},
transactions: {
raydiumLiquidityPoolV4: {
vote: false,
failed: false,
signature: undefined,
accountInclude: [RAYDIUM_PUBLIC_KEY.toBase58()],
accountExclude: [],
accountRequired: [],
},
},
transactionsStatus: {},
entry: {},
blocks: {},
blocksMeta: {},
accountsDataSlice: [],
ping: undefined,
commitment: CommitmentLevel.CONFIRMED,
};
subscribeCommand(client, req);
当然,你注意到了,并且可能会惊讶于这可能是所有的代码,虽然可能不是。 这是从 Solana 区块链上流式传输链上数据的底层代码。 除了 Raydium 之外,还有其他平台上的一些示例。
要了解有关订阅请求的更多信息,请随时查看我们的另一篇文章 使用 Shyft gRPC 流式传输 Solana 交易。
分解一下,这段代码通过将 raydiumLiquidityPoolV4
输入到 transaction slot 中,并将 RAYDIUM_PUBLIC_KEY
包含在 accountInclude
slot 中来检索数据。 这允许从 Raydium DEX 进行有针对性的数据检索。
重要的是要注意,你的“client”变量需要填写你的 ‘YOUR Shyft GRPC URL ACCESS’ 和 ‘YOUR X TOKEN’,请访问 Shyft 以了解如何获取它。
接下来,我们需要有效地处理更新。 我们不想获取 Raydium 上的所有数据,包括监听各种事件,如 swapIn
、swapOut
、addLiquidity
和 removeLiquidity
,而是希望专注于检索新添加的池子,并将我们的数据简化为几个必要的输入。 为此,我们需要使用 Stream.on
函数。 Stream.on
函数允许我们指定要接收的更新类型,从而能够过滤掉不必要的数据,并且只处理与我们的应用程序相关的新添加的池子。 这种方法有助于降低数据处理的复杂性和开销,从而使我们的系统更高效和可扩展。
stream.on("data", (data) => {
try{
if (data?.transaction) {
const txn = TXN_FORMATTER.formTransactionFromJson(
data.transaction,
Date.now(),
);
const decodedRaydiumIxs = decodeRaydiumTxn(txn);
if (!decodedRaydiumIxs?.length) return;
const createPoolIx = decodedRaydiumIxs.find((decodedRaydiumIx) => {
if (
decodedRaydiumIx.name === "raydiumInitialize" ||
decodedRaydiumIx.name === "raydiumInitialize2"
) {
return decodedRaydiumIx;
}
});
if (createPoolIx) {
const info = JSON.stringify(createPoolIx.args);
const parseInfo = JSON.parse(info);
const solVault = parseInfo.pool_pc_token_account;
const tokenVault = parseInfo.pool_coin_token_account;
const solAddress = parseInfo.pc_mint_address;
const tokenAddress = parseInfo.coin_mint_address;
const lpMint = parseInfo.lp_mint_address;
const pool = parseInfo.pool_withdraw_queue;
const dev_wallet = parseInfo.user_wallet;
const openTime = parseInfo.openTime
const startTime = new Date(openTime * 1000);
const initialBalance = parseInfo.initPcAmount;
console.log("found")
bot.sendMessage(msgId,`
New LP Found https://translator.shyft.to/tx/${txn.transaction.signatures[0]} \n
Token Address | ${tokenAddress}
Sol Address | ${solAddress}
Token Vault | ${tokenVault}
Sol Vault | ${solVault}
Lp mint | ${lpMint}
Pool | ${pool}
Initial Balance | ${initialBalance/1000000000} sol
Start Time | ${startTime}
Owner/Dev | ${dev_wallet}
`
);
}
}
}catch(error){
if(error){
console.log("Error")
}
}
});
此代码为“raydiumInitialize”和“raydiumInitialize2”事件设置了事件监听器,使我们能够捕获和处理 Raydium 上新添加的流动性事件。
如果你想要此项目的完整代码片段,请随时在 GitHub 上此处查看。
使用专用节点在 Solana 区块链上流式传输数据可能是一项复杂且资源密集型的任务,通常需要更大且更复杂的代码库。 然而,借助 gRPC,开发人员现在可以方便地流式传输链上数据。 在 Shyft,我们很高兴向开发者社区介绍这种创新解决方案。 通过利用 gRPC,开发者可以简化他们的代码,并专注于构建强大的应用程序,从而利用 Solana 区块链的强大功能。 我们的团队致力于提供必要的工具和支持,以使这个过程无缝进行。 如需进一步帮助,请加入我们的 Discord 服务器 或在 Twitter 上关注我们以获取更新。
- 原文链接: blogs.shyft.to/how-to-bu...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!