> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 交易监控

> 使用 Yellowstone gRPC 流式传输并过滤实时 Solana 交易

## 概述

交易订阅在网络确认交易时提供执行结果。您可以按涉及的账户进行过滤、排除投票交易，并选择是否包含失败的交易。

## 过滤参数

| 参数                | 类型         | 描述                                   |
| ----------------- | ---------- | ------------------------------------ |
| `vote`            | `boolean`  | 包含（`true`）或排除（`false`）投票交易。默认：包含所有。  |
| `failed`          | `boolean`  | 包含（`true`）或排除（`false`）失败的交易。默认：包含所有。 |
| `signature`       | `string`   | 监控单个特定交易签名。                          |
| `accountInclude`  | `string[]` | 仅包含涉及这些账户中任意一个的交易（逻辑 OR）。            |
| `accountExclude`  | `string[]` | 排除涉及这些账户中任意一个的交易。                    |
| `accountRequired` | `string[]` | 仅包含涉及所有这些账户的交易（逻辑 AND）。              |

<Note>
  `accountInclude` 和 `accountRequired` 协同工作：`accountInclude` 允许任意匹配，而 `accountRequired` 要求列出的每个账户都必须存在。组合使用它们以构建精确过滤器。
</Note>

## 示例：监控特定程序

```typescript theme={null}
import Client, { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc";

const client = new Client(
  "https://your-endpoint.grpc.orbitflare.com",
  "YOUR_GRPC_TOKEN",
  { "grpc.max_receive_message_length": 64 * 1024 * 1024 }
);

async function main() {
  const stream = await client.subscribe();

  const streamClosed = new Promise<void>((resolve, reject) => {
    stream.on("error", (error) => { reject(error); stream.end(); });
    stream.on("end", () => resolve());
    stream.on("close", () => resolve());
  });

  stream.on("data", (data) => {
    if (data.transaction) {
      const { transaction, slot } = data.transaction;
      const sig = Buffer.from(transaction.signature).toString("base64");
      const failed = transaction.meta?.err != null;
      console.log(`[slot ${slot}] ${failed ? "失败" : "成功"} 交易: ${sig}`);
    }
  });

  const request: SubscribeRequest = {
    transactions: {
      raydiumSwaps: {
        vote: false,
        failed: false,
        accountInclude: [
          "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8", // Raydium AMM v4
        ],
        accountExclude: [],
        accountRequired: [],
      },
    },
    commitment: CommitmentLevel.CONFIRMED,
    accounts: {},
    accountsDataSlice: [],
    slots: {},
    transactionsStatus: {},
    blocks: {},
    blocksMeta: {},
    entry: {},
    ping: { id: 1 },
  };

  await new Promise<void>((resolve, reject) => {
    stream.write(request, (err) => {
      if (err == null) resolve(); else reject(err);
    });
  });

  await streamClosed;
}

main();
```

## 常见使用场景

| 使用场景        | 过滤策略                                                           |
| ----------- | -------------------------------------------------------------- |
| 监控 DEX 的兑换  | `accountInclude: [dexProgramId]`，`vote: false`                 |
| 检测钱包活动      | `accountInclude: [walletPubkey]`，`vote: false`，`failed: false` |
| 监控特定代币铸币    | `accountInclude: [mintAddress]`                                |
| 追踪所有非投票成功交易 | `vote: false`，`failed: false`，无账户过滤                            |
| 监控单个交易      | `signature: "txSignatureHere"`                                 |
