本文介绍了如何使用 QuickNode 的 Base DeFi Power Bundle 构建一个具有 MEV 保护的 Telegram 交易机器人。
DeFi 交易机器人是简化用户体验的强大工具,但它们面临着重大的挑战,包括抢跑攻击、因不准确的 gas 定价导致的交易失败以及跨去中心化交易所 (DEX) 的低效路由。为 DeFi 构建安全、用户友好且高性能的 Telegram 交易机器人需要强大的基础设施来有效处理这些问题。
QuickNode 的 Base DeFi Power Bundle 提供了一套强大的附加组件,用于解决 Base Mainnet 上 DeFi 开发中的关键痛点。这些附加组件使开发人员能够创建一个具有高级功能的 Telegram 交易机器人,例如 MEV 保护、优化的 gas 估算和无缝的跨 DEX 交易。该捆绑包包括:
在本指南中,你将学习如何构建一个 Telegram 交易机器人,该机器人使用这些附加组件在 Base 主网上安全有效地交易 ERC-20 代币。该机器人提供以下功能:
最终产品应如下所示:
我们将引导你了解应用程序的工作原理、每个附加组件的使用方式以及如何自行设置和测试它。
如何在 BASE 上创建 Telegram 交易机器人 在 YouTube 上观看
在深入研究代码之前,让我们先探讨一下这个 Telegram 机器人的架构方式,以及它如何利用 QuickNode 的 Base DeFi Bundle 以及本地存储来提供安全、实时的交易功能。
此图显示了用户如何与机器人交互,以及机器人如何使用本地服务(如用于安全存储的 SQLite)和外部 API 来完成命令。
单击以查看详细图表
该机器人使用本地 SQLite 数据库(通过 better-sqlite3
)安全地存储用户数据,并确保跨会话的持久性。它既轻量级又强大,使机器人可以立即访问用户设置、钱包信息和交换历史记录。
这是它跟踪的内容:
表 | 目的 |
---|---|
users |
存储 Telegram 用户元数据(ID、用户名、姓名、时间戳) |
wallets |
存储加密的私钥和地址 |
settings |
跟踪用户偏好,如滑点和 gas 优先级 |
transactions |
记录交换历史记录:来自/发送到代币、使用的 gas、状态等 |
每个私钥都使用 .env
文件中定义的密钥通过 AES-256-CBC 进行加密,从而确保存储钱包的强大安全性。用户可以创建、导入和导出钱包,并且他们的配置在会话中保持不变。
架构和逻辑位于 src/lib/database.ts
中,并且表会在首次运行时自动初始化。
命令被组织成功能类别:
应用程序逻辑封装在专门的库中:
Sentio 的 Gas 估算 API 基于 mempool 模拟提供实时 gas 费用预测,比标准 eth_gasPrice
调用更准确。此 API 返回基于置信度的费用估算,使机器人能够向用户建议低、中或高 gas 选项,类似于 MetaMask 等钱包。
API 调用 ( sentio_gasPrice
) 返回一个 JSON 响应,其中包含不同置信度级别(例如,90%、95%、99%)的 gas 价格估算。
机器人将这些映射到用户友好的选项:
当用户发起交易(例如,/buy
)时,机器人会根据配置的优先级(低、中或高)获取 gas 价格,并将其包含在交换报价中。这确保用户具有可预测的费用,尤其是在网络拥塞期间。
在 src/lib/swap.ts
中,机器人查询 API 以获取 gas 价格:
export async function getGasEstimates(): Promise<BlockPrices> {
try {
const response = await axios.post(
QUICKNODE_RPC_URL,
{
jsonrpc: "2.0",
method: "sentio_gasPrice",
params: { chainId: BASE_CHAIN_ID },
id: 1,
},
{
headers: { "Content-Type": "application/json" },
}
);
const data = response.data;
if (data.error) {
throw new Error(`Error fetching gas price: ${data.error.message}`);
}
return data as BlockPrices;
} catch (error) {
console.error("Error fetching gas price:", error);
return { blockPrices: [] };
}
}
OpenOcean v4 Lightning Swap API 通过聚合多个去中心化交易所 (DEX)(如 Uniswap、SushiSwap 和 Aerodrome)的流动性,可以在 Base Mainnet 上实现快速准确的代币交换。
/quote
端点提供交换预览,包括最佳交换路径、预期输出金额和估计的 gas 成本。这会显示给用户以供确认。/swap
端点返回一个预签名交易负载,机器人会对其进行签名并提交到区块链。当用户发起交易(例如,/buy
或 /sell
)时:
getQuote
以获取指定代币对和金额的报价,使用当前的 gas 价格。getSwap
以执行交换,使用报价和用户提供的 gas 价格。这种集成简化了流动性聚合,并确保高效、用户友好的交易。
在 src/lib/swap.ts
中,机器人使用 OpenOcean API 来获取交换报价并执行交易:
export async function getQuote(
inTokenAddress: string,
outTokenAddress: string,
amount: string,
gasPrice: string
): Promise<QuoteResponse> {
try {
// Construct URL - QUICKNODE_RPC_URL has `/` at the end in default
let url = `${QUICKNODE_RPC_URL}addon/${ADDON_ID}/v4/${CHAIN}/quote?inTokenAddress=${inTokenAddress}&outTokenAddress=${outTokenAddress}&amount=${amount}`;
if (gasPrice) {
url += `&gasPrice=${gasPrice}`;
}
// Fetch quote
const response = await axios.get(url);
const data = response.data;
if (isErrorResponse(data)) {
throw new Error(`OpenOcean API error: ${data.error}`);
}
return data;
} catch (error) {
console.error(
"Failed to get quote:",
error instanceof Error ? error.message : String(error)
);
throw error;
}
}
Merkle 提供的 MEV 保护和 Gas 恢复附加组件 可以保护交易免受抢跑和三明治攻击,同时通过在交换失败或消耗的 gas 少于估计值时恢复未使用的 gas 来优化 gas 使用量。
当机器人通过 viem
调用 sendTransaction
时,它会在后台使用 eth_sendRawTransaction
。启用该附加组件后,这些交易会自动路由到 Merkle 的私有中继,从而保护它们免受抢跑和三明治攻击。除了使用 QuickNode RPC 端点之外,无需其他配置。
/**
* Create a wallet client for the given private key
*/
function createClient(account: Account): WalletClient {
return createWalletClient({
account,
chain: base,
transport: http(QUICKNODE_RPC_URL),
});
}
Blockbook JSON-RPC API 提供了对 Base Mainnet 上指定日期的钱包余额历史记录、当前代币余额以及法币等价值的访问。
bb_getBalanceHistory
):检索指定地址在给定时间范围内的 ETH 余额趋势。它包括法币价格(例如,美元)并支持可自定义的时间分组(例如,每小时)。当用户运行 /history
时,机器人会调用 getBalanceHistory
以获取并显示 ETH 余额趋势(例如,每日、每周或每月)在文本表中,包括美元等值。
bb_getAddress
):返回当前的 ETH 和 ERC-20 代币余额,以及按区块高度排序的交易历史记录。机器人可以过滤结果以仅显示通过机器人交易的代币。/balance
命令触发 getEthBalance
和 getTokenBalance
以向用户显示 ETH 和 ERC-20 代币余额。机器人可以选择过滤输出以高亮显示通过机器人交易的代币。
要开始在 Base Mainnet 上构建 Telegram 交易机器人,你需要配置你的开发环境并安装所需的依赖项。本节将指导你完成克隆存储库、设置环境变量以及准备 QuickNode 和 Telegram 所需的凭据。
免责声明
本指南中提供的代码仅用于教育目的,未经审核。未经彻底的测试、审核和安全审查,不应在生产环境中使用它们。
git clone https://github.com/quiknode-labs/qn-guide-examples.git
cd qn-guide-examples/base/telegram-trading-bot
选择你喜欢的包管理器来安装项目依赖项:
npm install
## or
yarn install
## or
pnpm install
## or
bun install
此命令安装 package.json
中列出的所有必需包。
你需要一个 Telegram 机器人Token才能与用户交互。按照以下步骤创建新机器人:
/newbot
命令并按照提示命名你的机器人。该机器人使用 AES-256-CBC 加密安全地存储加密的用户钱包。你必须在环境变量中提供一个 32 字符的密钥。你可以使用任何方法生成随机字符串,例如:
openssl rand -base64 32
重要:此密钥用于加密和解密用户的私钥。没有它,或者如果它丢失了,则无法解密存储的钱包。安全地存储它,并且永远不要与任何人分享。
复制示例环境文件以创建你自己的:
cp .env.example .env
然后,使用你的凭据和设置编辑 .env
文件:
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
QUICKNODE_RPC=your_quicknode_endpoint
WALLET_ENCRYPTION_KEY=your_random_32_char_string
DB_PATH=./db.sqlite
CHAIN_ID=8453
DEFAULT_SLIPPAGE=1
DEFAULT_GAS_PRIORITY=medium
将 your_telegram_bot_token
、your_quicknode_endpoint
和 your_random_32_char_string
替换为你从前面的步骤中获得的相应值。此外,如果你想自定义机器人的行为,可以修改默认值。
设置你的环境并安装依赖项后,你就可以在本地启动 Telegram 交易机器人并在 Base Mainnet 上测试其功能了。
运行以下命令以在开发模式下启动机器人:
npm run dev
## or
pnpm dev
## or
yarn dev
## or
bun dev
预期输出:
🤖 Starting Base MEV-Protected Telegram Trading Bot...
✅ Bot started successfully!
ℹ️ Press Ctrl+C to stop the bot
如果你看到此输出,则机器人正在运行并准备好接受 Telegram 命令。如果机器人启动失败,请检查你的 .env
文件中是否存在缺失或不正确的值,并验证是否已安装依赖项。
如果在启动机器人时遇到 Error: Could not locate the bindings file.
错误,请参阅以下部分以获取可能的解决方案。
单击以展开可能的解决方案
这表明 better-sqlite3
本机绑定未能正确构建,通常是由于 Node.js 版本不匹配或依赖项编译不完整。
从源代码重建本机绑定:
cd node_modules/better-sqlite3
npm run build-release
## or
pnpm run build-release
ls build # Verify that a .node file (e.g., better_sqlite3.node) appears
cd ../..
此命令会为你的系统的 Node.js 版本编译绑定,从而解决该错误。
清理并重新安装依赖项: 如果重建失败,请清除 node_modules
目录并重新安装:
rm -rf node_modules package-lock.json
npm install
## Or, if using pnpm:
rm -rf node_modules pnpm-lock.yaml
pnpm install
检查 Node.js 版本:确保你使用的是 Node.js 20.x 或更高版本,因为 better-sqlite3 可能不支持较旧的版本。
在本地运行机器人的情况下,你可以通过 Telegram 与其交互以测试其核心功能。
打开 Telegram 并使用通过 @BotFather 设置的用户名(例如,@YourTradingBot)搜索你的机器人。
单击“开始”或发送 /start
来开始对话。
/start
:显示欢迎消息并提示创建或导入钱包。/create
:生成一个新钱包并显示地址和私钥。/import
:使用提供的私钥导入现有钱包。/wallet
:显示当前钱包的地址。/balance
:显示 ETH 和 ERC-20 代币余额。/history
:检索余额趋势(例如,每日或每周)。/buy
:使用 ETH 发起代币购买,从 OpenOcean 获取报价。/sell
:出售代币以换取 ETH,需要用户确认。/settings
:调整 gas 优先级(低、中、高)或滑点容差。如果机器人按预期响应,那么恭喜!🎉 你已成功在 Base Mainnet 上部署了安全、受 MEV 保护的交易助手。
在机器人成功运行并在本地测试后,你可以增强其功能,部署它以供更广泛的使用,并为其开发做出贡献:
探索 QuickNode 附加组件和产品
增强机器人功能
/buy
和 /sell
建议支持流行的 Base Mainnet 代币。部署到生产环境
为开源存储库做出贡献
机器人的代码是 QuickNode 的指南示例 存储库中的开源项目的一部分。通过以下方式做出贡献:
优化和监控
通过探索 QuickNode 的生态系统、为开源社区做出贡献以及添加高级功能,你可以将此机器人转变为根据你的需求量身定制的强大 DeFi 工具。
该项目演示了 QuickNode 的 Base DeFi Power Bundle 的强大功能,使你能够以最少的基
- 原文链接: quicknode.com/guides/def...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!