本文介绍了如何使用 Shyft 和 Jito bundle 创建 Solana Raydium Telegram 交易机器人。文章详细介绍了 Shyft 工具的优势,以及如何利用 Jito 进行交易验证。内容涵盖 Telegraf 机器人配置、代码实现,以及如何使用 Shyft 的 GraphQL API 获取链上数据。最后总结了构建过程,并提供了相关资源链接。
由于生态系统的差异,从 Ethereum 过渡到 Solana 可能具有挑战性。虽然 Ethereum 已经建立完善,但 Solana 提供了更快的交易速度和更低的费用等优势。为了简化这种过渡,Shyft 团队创建了一个工具,其中包含详细的文档,以帮助开发者高效地在 Solana 上进行构建。
在这篇博客中,我们将指导你使用 Shyft 和 Jito bundle 创建一个 Solana Raydium Telegram 交易机器人。我们的分步教程将涵盖所有内容,从使用 BotFather 设置你的机器人,到利用 Shyft 和 Jito 工具在 Solana 区块链上进行交易验证和执行。在本文结束时,你将拥有一个坚实的基础,可以在 Solana 上构建你自己的交易机器人,从而利用 Shyft 和 Jito 的优势。
Shyft 是一个在 Solana 区块链上构建的强大工具。它提供了一套工具和服务,使开发者可以轻松地与 Solana 区块链交互并构建去中心化应用程序。我们的主要功能之一是能够处理链上调用并获取必要的链上信息。这使其成为构建需要频繁与区块链交互的复杂应用程序的理想选择。另一个有用的功能是它对 Token 创建的支持。如果你有兴趣了解更多信息,可以访问我们的网站 https://shyft.。
虽然 Shyft 提供了一套用于在 Solana 区块链上构建的强大工具,但它不提供用于交易验证的内置解决方案。这就是 Jito 的用武之地。Jito 是一个使用简单的配置文件构建和部署 Solana 程序的工具。其主要功能之一是它能够在单个请求中发送多个交易,这可以提高交易处理的可靠性和速度。在我们的 Telegram 交易机器人中,我们使用 Jito 来验证我们在 Solana 区块链上的交易,并使用 Shyft RPC 发送我们的交易。通过结合两者的优势,我们能够构建一个快速、可靠且易于使用的 Telegram 交易机器人。
要开始使用我们的机器人,第一步是使用 Bot Father 创建一个 Telegram 机器人 Token。为此,请导航到 Telegram 应用程序并搜索“@BotFather”机器人。按照提示创建一个新机器人并获取你的机器人 Token。接下来,我们将使用 Telegraf 库来构建我们的 Telegram 机器人界面。在代码中,我们需要进行一些必要的输入,包括机器人 Token 和聊天 ID。要获取你的聊天 ID,你可以在机器人的代码中使用 console.log(ctx)
命令来打印 context 对象,其中包含聊天 ID。以下是如何构建代码以创建机器人并获取必要输入的示例:
const TELEGRAM_BOT_TOKEN = "Your Token"
const bot = new Telegraf(TELEGRAM_BOT_TOKEN)
const msgId = 'input your chat id';
bot.on('text', async(ctx) => {
const Response = console.log(ctx)
一旦机器人运行并且 Token 合约地址已输入,它就会等待流动性池启动。一旦池启动,机器人就会自动购买。然后,它等待流动性池 Token 的价格上涨 MIN_PROFIT_PERCENTAGE
变量。一旦达到利润阈值,机器人就会使用“/sell”命令出售流动性池 Token。在这个机器人中,我们使用 raydium swap sdk 来促进我们的 swap 指令,就像 uniswap 对 Ethereum 一样,请查看如何使用 raydium sdk 在 Solana 上进行 swap 这里。
为了构建我们的 Telegram 交易机器人,我们首先需要克隆代码仓库并安装所有依赖项。以下是我们遵循的步骤:
克隆代码仓库:我们使用以下命令从 GitHub 克隆了代码仓库:
$ git clone https://github.com/Shyft-to/solana-defi.git
cd telegram-trading-bot
npm install
首先我们需要进行正确的导入
import { id } from 'ethers';
import {Telegraf, TelegramError} from 'telegraf'
import { Connection, Keypair, PublicKey } from '@solana/web3.js';
import { gql, GraphQLClient } from "graphql-request";
import * as anchor from "@project-serum/anchor";
import {Buy,Sell} from "./swapAmm"
import {
Metadata,
PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID,
} from "@metaplex-foundation/mpl-token-metadata";
import { Wallet } from '@project-serum/anchor';
import { quote } from 'telegraf/typings/format';
为了构建我们的 Telegram 交易机器人,我们需要从 Solana 区块链获取某些链上数据。具体来说,我们需要获取以下信息:
为了获取所需的数据,我们将使用 Shyft 的 GraphQL API,它为开发者提供了显着的优势。GraphQL 是一种强大的查询语言,使开发者能够以灵活且高效的方式从 API 请求特定数据。我们使用 Shyft 的 GraphQL API 的主要原因之一是它们提供对 SuperIndexer 的访问,SuperIndexer 是一种以亚秒级延迟索引所有更改的功能。这意味着数据会近乎实时地更新,确保我们检索到的信息始终是最新的和准确的。此外,Shyft 的 GraphQL API 提供了一个直观且易于使用的查询界面,使开发者可以快速轻松地检索他们需要的数据。使用 GraphQL,你可以准确指定要检索的数据,从而减少返回的不必要数据的量,并提高应用程序的整体性能。这是一个 GraphQL 查询的示例,该查询使用 Shyft 的 GraphQL API 获取我们需要的信息:
async function queryLpMintInfo(token: string, sol: string) {
// See how we are only querying what we need
// 看看我们是如何只查询我们需要的
const query = gql`
query MyQuery ($where: Raydium_LiquidityPoolv4_bool_exp) {
Raydium_LiquidityPoolv4(
where: $where
) {
baseMint
lpMint
lpReserve
baseVault
poolOpenTime
lpVault
quoteMint
quoteVault
baseDecimal
owner
pubkey
}
}`;
const variables = {
where: {
baseMint: {
_eq: token,
},
quoteMint: {
_eq: sol,
},
},
};
return await graphQLClient.request(query, variables);
}
为了使用我们刚刚创建的 GraphQL 客户端请求,我们需要在函数中调用它。这是一个我们如何做到这一点的例子:
async function info(pair) {
const SOLANA : string = 'So11111111111111111111111111111111111111112';
let vault;
let check;
// for(const trade of array){
// pair = trade;
// }
if(pair == undefined || pair == null){
console.log(`it is null`)
}else{
const mint = new anchor.web3.PublicKey(
pair
);
const [metadataPDA] = anchor.web3.PublicKey.findProgramAddressSync(
[\
Buffer.from("metadata"),\
TOKEN_METADATA_PROGRAM_ID.toBuffer(),\
mint.toBuffer(),\
],
TOKEN_METADATA_PROGRAM_ID
);
const accInfo = await connection.getAccountInfo(metadataPDA);
const metadata = Metadata.deserialize(accInfo.data, 0);
const tokenName = metadata[0].data.name;
const tokenSym = metadata[0].data.symbol;
const data:any = await queryLpMintInfo(pair,SOLANA);
const info = data.Raydium_LiquidityPoolv4[0];
if(info == null){
return null
}else{
let ownerBalance;
const openTime = info.poolOpenTime;
const startTime = new Date(openTime * 1000);
const token : String = info.baseMint
const tokenVault : String = info.baseVault
const solVault: String = info.quoteVault;
const lp = info.pubkey
const decimal = info.baseDecimal;
// const qvault = info.quoteVault;
const owner = metadata[0].updateAuthority;
const lpReserve = info.lpReserve;
const ownerInfo = await connection.getAccountInfo(new PublicKey(owner))
if(ownerInfo == null){
ownerBalance = "Renounced"
}else{
ownerBalance = await ownerInfo.lamports/1000000000;
}
const tokenAddress = new PublicKey(solVault)
vault = solVault
check = await connection.getTokenAccountBalance(
tokenAddress
)
const vaultBalance = await check.value.uiAmount;
// const successful = await orderBuys(msUntilTarget,token.toString(),lp.toString(),Number(decimal))
return {
tokenName,
tokenSym,
lp,
vaultBalance,
startTime,
token,
decimal,
vault,
owner,
// successful,
ownerBalance
}
}
}
}
=> 在此代码中,我们正在发出 GraphQL 客户端请求,以获取有关一对 Token 的各种数据点,包括池打开时间、池密钥、小数、金库、我们的流动性提供者 (LP) Token 余额和所有者的 Token 余额。我们的机器人旨在等待特定的合约地址启动后再进行购买,这涉及重复一些代码。具体来说,我们使用一个循环来定期检查合约地址是否已启动,如果是,我们将发出 GraphQL 客户端请求以获取必要的数据并根据该数据执行某些操作。这是一个我们如何构建代码以处理此重复的示例:
console.log("trade : " + trades[0])
let interval = setInterval(async() => {
tokenInfo = await info(trades[0])
console.log(`Searching for ${trades[0]}`)
if(tokenInfo != null){
console.log(`Search over`);
tInfo = false;
clearInterval(interval)
console.log(`${tokenInfo.tokenName} Launched!!`)
ctx.reply(
` 🪙 ${tokenInfo.tokenName} Token Info
Name: ${tokenInfo.tokenName}
Symbol: ${tokenInfo.tokenSym}
Pair Token : SOLANA
Pair: ${tokenInfo.lp}
Token: ${tokenInfo.token}
Vault: ${tokenInfo.vault}
Sol Bal: ${Number(tokenInfo.vaultBalance).toFixed(2)} Sol
Decimal: ${tokenInfo.decimal}
OpenTime: ${tokenInfo.startTime}
👨🏻💻 Owner Info
Address: ${tokenInfo.owner}
Balance: ${Number(tokenInfo.ownerBalance).toFixed(2)} SOL
`
)
为了运行我们的 Telegram 交易机器人,我们需要输入必要的键值,包括我们的 RPC API 密钥和私钥。以下是我们如何操作的:
为了运行我们的 Telegram 交易机器人,我们需要输入必要的键值,包括我们的 RPC API 密钥和私钥。以下是我们如何操作的:
index.ts
和 swap.ts
文件中,并将你的 Shyft API 密钥输入到 build-bundle
和 send-bundle
脚本中。const privateKey = new Uint8Array([\
//your private key
//你的私钥
]);
export const rpc_https_url = "https://rpc.shyft.to?api_key=your api key";
恭喜!你已经使用 Shyft 和 Jito 构建了一个 Telegram 交易机器人。本指南为你提供了在 Solana 上开始构建的基础。如需进一步帮助,请加入我们的 Discord 频道或在 Twitter 上关注我以获取更新。在做出任何投资决定之前,请务必进行自己的研究并咨询财务顾问。祝你构建愉快!
加入 Shyft Discord 服务器 并在 Twitter 上关注我们。
关于我: 我是 Mona Paul,一位区块链开发者,拥有 3-4 年的 Solana 和 EVM(Ethereum、Base、Avalanche)经验。在 Solana 上工作时,由于缺乏文档,我遇到了构建项目的困难。但是,通过使用 Shyft,我能够成功完成其中的大部分。我希望本文能指导你朝着正确的方向轻松进行 Solana 开发。联系我:https://twitter.com/Ahyammona
- 原文链接: blogs.shyft.to/how-to-bu...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!