本文介绍了如何使用 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
 
                如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!