本文介绍了如何使用 Shyft Callback API 实时监听 Raydium 上新增的交易池。通过注册回调API,可以追踪 Raydium 上的 swap、添加流动性、移除流动性等活动,并利用 Shyft JS SDK 简化注册流程。文章还展示了如何设置 API 接收回调数据,并对回调数据进行分析,最后展示了swap交易的json数据结构,为 DApp 提供实时更新。
在今天的文章中,我们将探讨使用 Shyft APIs 跟踪 Raydium 上的活动(例如交换 token、添加流动性和移除流动性)的最简单方法之一。Raydium 是一个构建在 Solana 区块链上的自动化做市商 (AMM),它利用中心限价订单簿来实现闪电般的交易速度、共享流动性和赚取收益的新功能。此外,我们将研究使用 Shyft APIs 监控和分析这些交易的好处。
在此处阅读 SHYFT API 文档 here .
要开始,我们需要准备一些东西。
x-api-key
是一个身份验证参数,它使你可以访问 Shyft APIs。你可以从 Shyft 网站获取 你自己的 API 密钥。 只需在此处使用你的电子邮件 ID 注册即可免费获得。如果你已经拥有 Shyft API 密钥,请跳过此步骤。
我们的教程将分为三个步骤:
Shyft 使我们能够为特定地址注册回调。这意味着每当这些地址发生任何链上事件时,Shyft 会立即通知我们相关的事件数据。在我们的例子中,我们为 Raydium AMM 程序地址 注册一个回调。这使 Shyft 能够在发生诸如交换、添加流动性或移除流动性等事件时立即通知我们。
要注册回调,你可以选择手动调用 Shyft 的回调注册 API 或通过提供必要的数据来使用 Shyft JS SDK。在我们的教程中,我们将选择 Shyft JS SDK 以增加便利性。有关回调 API 的更多详细信息,你可以在此 link 找到更多信息。
// setup Shyft client
import { Network, ShyftSdk } from "@shyft-to/js"
const RAYDIUM_AMM_ADDRESS = "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8";
const registerCallback = async () => {
const shyft = new ShyftSdk({
apiKey: process.env.NEXT_PUBLIC_SHYFT_API_KEY!,
network: Network.Mainnet,
});
await shyft.callback.register({
network: Network.Mainnet,
addresses: [RAYDIUM_AMM_ADDRESS],
// The URL of your API that listens for the callback event.
// We will be set up in the next step.
// 你的 API 的 URL,用于监听回调事件。
// 我们将在下一步进行设置。
callbackUrl: `${window.location.href}api/callback`,
// In our tutorial, we are only interested in three events, but you can provide as many events as you like.
// 在我们的教程中,我们只对三个事件感兴趣,但你可以根据需要提供任意数量的事件。
events: [TxnAction.SWAP, TxnAction.ADD_LIQUIDITY, TxnAction.REMOVE_LIQUIDITY],
});
console.log("success");
};
此 API 是一个标准的 POST API。我们在上一步中向 Shyft 提供了此 API 的 URL。当事件发生时,Shyft 将调用此 API 并将数据发送给我们。我们的责任包括检查和分析数据。 在我们的文章中,我们仅展示数据,但你可以随意将其用于任何你想要的目的,例如在前端显示此数据或将其存储在数据库中以供以后使用。要获得有关回调数据结构的更多见解,你可以参考此 link。
import { CallbackDataType } from "@/types";
import { NextApiResponse } from "next";
import { NextRequest } from "next/server";
import { TxnAction } from "@shyft-to/js";
const ACTIONS = [\
TxnAction.ADD_LIQUIDITY,\
TxnAction.REMOVE_LIQUIDITY,\
TxnAction.SWAP,\
TxnAction.CREATE_POOL,\
];
export async function POST(req: NextRequest, res: NextApiResponse) {
const body = (await req.json()) as CallbackDataType;
if (
!body.type ||
!body.actions ||
body.status !== "Success" ||
!ACTIONS.includes(body.type as TxnAction)
)
return res.status(400).json({ message: "Invalid callback data" });
// 你可以将回调数据存储到数据库中以供以后使用。
// You can store the callback data into database for later use.
console.dir(body, { depth: null });
return Response.json({ success: true });
}
每当发生链上事件(例如有人在 Raydium 上交换 token、添加流动性或移除流动性)时,我们已经成功设置了一个后端服务器,用于接收来自 Shyft 的数据。此数据对于你的 dApp 来说非常有价值,你可以使用它来在前端进行实时更新,让用户随时了解情况。让我们分析一下当有人在 Raydium 上交换 token 时我们收到的数据。
{
"timestamp": "2024-01-11T07:23:15.000Z",
"fee": 0.000005003,
"fee_payer": "MeowujaCA1FGaA7hna2ezUXLbrj36qZi4hGx94xNQLo",
"signers": [ "MeowujaCA1FGaA7hna2ezUXLbrj36qZi4hGx94xNQLo" ],
"signatures": [\
"29YJoYraAvHPAWS6ANU1Ei4SyC5ErqzR18cVZ9MTt15V4LJArgPeoQydXJXhCTZpSsu9w4CirV2grZqFxbT5JxAa"\
],
"protocol": {
"address": "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
"name": "RAYDIUM_LIQUIDITY_POOL_V4"
},
"type": "SWAP",
"status": "Success",
"actions": [\
{\
"info": {\
"swapper": "MeowujaCA1FGaA7hna2ezUXLbrj36qZi4hGx94xNQLo",\
"tokens_swapped": {\
"in": {\
"token_address": "2KE2UNJKB6RGgb78DxJbi2HXSfCs1EocHj4FDMZPr4HA",\
"name": "Slow Protocol",\
"symbol": "SLOW",\
"image_uri": "https://t3wsqd23o7n5d2pjgvspqafxi3jcznjfrdgwkh6acmgf3zjpnsgq.arweave.net/nu0oD1t329Hp6TVk-AC3RtIstSWIzWUfwBMMXeUvbI0",\
"amount": 17.90357\
},\
"out": {\
"token_address": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",\
"name": "Marinade staked SOL (mSOL)",\
"symbol": "mSOL",\
"image_uri": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So/logo.png",\
"amount": 0.000460532\
}\
},\
"swaps": [\
{\
"liquidity_pool_address": "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1",\
"name": "SLOW-mSOL",\
"source": "raydiumAmm",\
"in": {\
"token_address": "2KE2UNJKB6RGgb78DxJbi2HXSfCs1EocHj4FDMZPr4HA",\
"name": "Slow Protocol",\
"symbol": "SLOW",\
"image_uri": "https://t3wsqd23o7n5d2pjgvspqafxi3jcznjfrdgwkh6acmgf3zjpnsgq.arweave.net/nu0oD1t329Hp6TVk-AC3RtIstSWIzWUfwBMMXeUvbI0",\
"amount": 17.90357\
},\
"out": {\
"token_address": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So",\
"name": "Marinade staked SOL (mSOL)",\
"symbol": "mSOL",\
"image_uri": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So/logo.png",\
"amount": 0.000460532\
}\
}\
],\
"slippage_in_percent": null,\
"quoted_out_amount": null,\
"slippage_paid": null\
},\
"source_protocol": {\
"address": "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",\
"name": "RAYDIUM_LIQUIDITY_POOL_V4"\
},\
"type": "SWAP"\
},\
{\
"info": {\
"amount": 0.000455053,\
"sender": "EyaSjUtSgo9aRD1f8LWXwdvkpDTmXAW54yoSHZRF14WL",\
"receiver_associated_account": "7ysRpeKN76QjwC4btS9a6hiyinvgzEVLvWPP97M42jNg",\
"receiver": "HobVrQpdkms7h57vcfaTW4Lqmxd5EatY2MYRavtvF1oL",\
"token_address": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So"\
},\
"source_protocol": {\
"address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",\
"name": "TOKEN_PROGRAM"\
},\
"type": "TOKEN_TRANSFER",\
"parent_protocol": "s1owa2k7P2kkLEenZPKuGddWMVpy8Pt2oMVeBdtSHM6"\
},\
{\
"info": {\
"amount": 0.000747644,\
"sender": "HobVrQpdkms7h57vcfaTW4Lqmxd5EatY2MYRavtvF1oL",\
"receiver_associated_account": "BgSvPcNqikNUDiHWLq8ms1LcHXBzaxHWhmg1TUcnpAfB",\
"receiver": "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1",\
"token_address": "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So"\
},\
"source_protocol": {\
"address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",\
"name": "TOKEN_PROGRAM"\
},\
"type": "TOKEN_TRANSFER",\
"parent_protocol": "s1owa2k7P2kkLEenZPKuGddWMVpy8Pt2oMVeBdtSHM6"\
},\
{\
"info": {\
"amount": 28.92023,\
"sender": "5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1",\
"receiver_associated_account": "8SDYmWNY3omVgX2qe5yyWADYa7dhewfxfmgyx8zZx6TW",\
"receiver": "HobVrQpdkms7h57vcfaTW4Lqmxd5EatY2MYRavtvF1oL",\
"token_address": "2KE2UNJKB6RGgb78DxJbi2HXSfCs1EocHj4FDMZPr4HA"\
},\
"source_protocol": {\
"address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",\
"name": "TOKEN_PROGRAM"\
},\
"type": "TOKEN_TRANSFER",\
"parent_protocol": "s1owa2k7P2kkLEenZPKuGddWMVpy8Pt2oMVeBdtSHM6"\
}\
],\
"accounts": []
}
我们收到每个链上交易的人工可读数据。
type
字段指示交易的操作,在本例中为“Swap”。fee
、fee_payer
和 signers
字段是不言自明的:它们表示交易的 gas 费用、支付费用的钱包以及为交易签名的钱包。protocol
字段包含执行交易的程序的名称和地址。actions
字段是一个操作列表,提供详细信息,例如交换者的钱包、进出的 token 及其相应的数量。此外,如果你是 Discord 机器人的爱好者并且希望在你的 Discord 服务器中接收回调数据,你只需修改注册回调函数即可。将 callbackUrl
替换为你的 Discord webhook URL 并指定 type: DISCORD
。我们写了一篇文章,介绍如何使用 Shyft API 创建 Discord 机器人。你可以通过此 link 阅读它。
因此,我们刚刚指导你如何使用 Shyft Callback API 实时监听链上 Raydium 事件。通过监听链上事件,你可以轻松地为你的 DApp 提供实时体验。
我们真诚地希望你喜欢阅读这篇博文!如果你有任何疑问或想法,请随时访问我们的 Discord 社区。
非常感谢你抽出时间阅读它!
- 原文链接: blogs.shyft.to/tracking-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!