本文介绍了如何利用QuickNode的Streams功能,通过设置过滤器来监控Uniswap V2/V3上的特定ERC-20代币交易,并通过Telegram机器人发送通知。文章详细讲解了创建Telegram机器人、设置Streams、编写过滤器代码以及集成Telegram的步骤。
你可以通过在 Stream 中设置过滤器来利用 Streams 的强大功能,实现链上事件提醒。你的过滤器可以包含对流数据进行评估的条件逻辑,还可以自定义发送到 Stream 目的地的有效载荷。过滤你的 Stream 确保你只为所需的数据付费。
创建一个 Telegram 机器人,每当有人在 Uniswap V2/V3 上购买特定的 ERC-20 代币时通知你,这是一种及时了解代币活动的实用方法。
在本指南中,我们将使用 $PEPE 作为示例代币。我们将设置一个 Stream 来监控转账,使用过滤器检测 Uniswap V2/V3 上的代币购买,并直接与 Telegram 集成以发送通知。
@botfather
发送 /newbot
并按照提示操作来获取你的 Telegram 机器人Token。<bot_token>
。<bot_token>
替换为你的机器人Token:https://api.telegram.org/bot<bot_token>/getUpdates
chat
对象并复制其 id
- 这是 <your_chat_id>
- 请妥善保管,因为你稍后会需要它。导航到 QuickNode Streams 页面并点击 Create Stream 按钮。
在 Stream settings 页面上,将 Stream 配置为以下设置:
然后,使用以下代码来过滤 Stream。该代码过滤包含 Uniswap V2 和 V3 交换的交易收据,其中 Uniswap 路由器将特定代币(在本例中为 $PEPE 代币)发送到一个地址。你可以根据需要修改过滤器。过滤器会从匹配的转账中创建一个有效载荷,我们将发送到我们的 Telegram 机器人。请确保将 <your_chat_id>
替换为你的 Telegram 聊天 ID。注意:在没有匹配事件的区块上,我们的代码将返回 null
。这意味着我们的 Stream 只有在检测到流数据中的匹配事件时才会发送数据。
function main(stream) {
const tokenContractAddress = "0x6982508145454Ce325dDbE47a25d4ec3d2311933";
const uniswapV3SwapTopicHash = "0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67";
const uniswapV2SwapTopicHash = "0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822";
const transferTopicHash = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
const uniswapRouterAddress = "0x0000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fad";
const tokenName = "$PEPE"; // 代币名称
const decimals = 18; // 代币的小数位数
var messages = [];
var data = stream.data[0];
data.forEach(receipt => {
var swaps = [];
var tokenTransfers = [];
// 过滤 Uniswap V3 和 V2 交换事件
swaps = receipt.logs.filter(log =>
log.topics[0] === uniswapV3SwapTopicHash ||
log.topics[0] === uniswapV2SwapTopicHash
);
// 过滤匹配的代币转账
tokenTransfers = receipt.logs.filter(log =>
log.address.toLowerCase() === tokenContractAddress.toLowerCase() &&
log.topics[0].toLowerCase() === transferTopicHash.toLowerCase() &&
log.topics[1].toLowerCase() === uniswapRouterAddress.toLowerCase()
);
// 检查同一收据中是否有交换和转账
// 将匹配的转账解析到消息中
if (swaps.length > 0 && tokenTransfers.length > 0) {
tokenTransfers.forEach(transfer => {
let recipient = '0x' + transfer.topics[2].slice(26);
let amount = parseInt(transfer.data, 16);
let formattedAmount = (amount / Math.pow(10, decimals)).toFixed(decimals).replace(/\.?0+$/, ""); // 转换并格式化带小数位的金额
messages.push({
recipient,
amount: formattedAmount,
transactionHash: receipt.transactionHash
});
});
}
});
if (messages.length > 0) {
let formattedMessages = messages.map(msg => {
let addressLink = `[${msg.recipient}](https://etherscan.io/address/${msg.recipient})`;
let txHashLink = `[${msg.transactionHash}](https://etherscan.io/tx/${msg.transactionHash})`;
return `${addressLink} bought ${msg.amount} ${tokenName} in transaction ${txHashLink}!`;
});
return {
chat_id: "<your_chat_id>",
text: `** ${tokenName} Swaps detected!! **\n` + formattedMessages.join('\n'),
parse_mode: "Markdown"
};
} else {
return null;
}
}
你可以点击 Run Test 按钮以确保你的过滤器语法正确。你将看到一个示例响应,该响应在 Receipts 数据集上测试了你的过滤器代码。你可以将测试的区块编号设置为 20040311
,其中发生了 $PEPE 交换。
为了检索历史数据,你不需要启用重组处理选项,但如果你想流式传输实时数据,你可以启用 Latest block delay 或 Restream on reorg 功能来处理重组。你可以在此处了解更多关于重组的信息 here。页面完成后,点击 Next,你将需要配置你的 Stream 目的地。
然后,在 Stream destination 页面上,将目的地设置为 Webhook 并配置为与以下详细信息一致。如果未提及某个字段,可以保持原样。
https://api.telegram.org/bot<your_bot_token>/sendMessage
,确保插入 <your_bot_token>
所指示的内容。Content-Type: application/json
在激活 Stream 之前,使用 Test Destination 按钮验证你的设置。你可以返回上一步调整区块编号(例如,设置为符合你过滤条件的区块编号 - block\ 20019228)。这允许你在上线之前使用特定的 Streams 数据测试你的机器人。
要通过 CLI 再次测试,我们将发送一个 curl 请求来测试我们的 Telegram 机器人。打开你的终端应用程序并发送此 curl 请求,其中包含一个示例有效载荷,如果配置正确,它将触发你的 Telegram 机器人。请确保在 curl 请求中替换 <your_bot_token>
和 <your_chat_id>
。
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"chat_id": "<your_chat_id>",
"parse_mode": "Markdown",
"text": "** $PEPE Swaps detected!! **\n[0x000000fee13a103a10d593b9ae06b3e05f2e7e1c](https://etherscan.io/address/0x000000fee13a103a10d593b9ae06b3e05f2e7e1c) bought 3265.647766725334804505 $PEPE in transaction [0xce33006642e3e3491171b1324c3692a0178d155af1c09732b6ceb2255d8c3d7e](https://etherscan.io/tx/0xce33006642e3e3491171b1324c3692a0178d155af1c09732b6ceb2255d8c3d7e)!\n[0x236a6a5b483df9fb61a477e70cf2a8a85e7e36d5](https://etherscan.io/address/0x236a6a5b483df9fb61a477e70cf2a8a85e7e36d5) bought 1302993.458923408761620522 $PEPE in transaction [0xce33006642e3e3491171b1324c3692a0178d155af1c09732b6ceb2255d8c3d7e](https://etherscan.io/tx/0xce33006642e3e3491171b1324c3692a0178d155af1c09732b6ceb2255d8c3d7e)!"
}' \
https://api.telegram.org/bot<your_bot_token>/sendMessage
最后,点击 Create a Stream 按钮。Stream 启动后,检查你添加了机器人的 Telegram 频道或群组。
当检测到 $PEPE 交换时,你将从你的 Telegram 机器人看到类似这样的消息:
就这样!你刚刚创建了一个端到端的 Telegram 提醒系统,使用 Streams 和过滤器。要了解更多信息,请查看以下资源。
如果你有任何问题,请直接 联系我们。如果你有任何想法或建议,例如希望我们支持的新目的地、功能、指标或数据集。
此外,通过关注我们的 Twitter 并加入我们的 Discord 和 Telegram 公告频道,了解最新动态。
让我们知道 如果你有任何反馈或新主题的请求。我们很乐意听取你的意见。
- 原文链接: quicknode.com/guides/qui...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!