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

# 解析済みストリームで木星スワップを追跡

> describeProgram を使用して木星ルート命令のための解析済みストリームフィルターを構築し、購読します。

このガイドでは、実際のフィルターをステップバイステップで構築します：[プログラムディスカバリー](/docs/ja/parsed-streams/quickstart#discovery)を使用してウォレットの木星スワップを観察し、購読を開始する前にフィルターが正しいことを確認します。

<Steps>
  <Step title="プログラムを調べる">
    推測された命令名は、フィルターが黙って何も一致しない最も一般的な理由です。まず最初に`describeProgram`を呼び出して、照合対象の正確な名前を取得します。

    ```json Request theme={"system"}
    { "jsonrpc": "2.0", "id": 1, "method": "describeProgram", "params": [{ "program": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" }] }
    ```

    ```json Response theme={"system"}
    {
      "jsonrpc": "2.0", "id": 1,
      "result": {
        "id": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
        "name": "jupiter",
        "instructions": ["route", "shared_accounts_route", "exact_out_route"],
        "events": ["SwapEvent"],
        "roles": ["user_transfer_authority", "destination_token_account"]
      }
    }
    ```

    カタログ名よりもプログラムの**アドレス**を優先する方がよいです。同じ名前を共有するカタログエントリが複数存在することがあり、名前のルックアップはプログラムの古いバージョンに解決されることがあります。`route`と`shared_accounts_route`は、木星v6スワップの大部分をカバーする2つの命令なので、それらにフィルターを設定します。
  </Step>

  <Step title="フィルターを作成する">
    プログラムID、前のステップの命令名、監視するウォレットを組み合わせます。フィールドはANDで組み合わされるため、このフィルターはウォレットのSOLアカウントに関わるルート命令に一致します。

    ```json theme={"system"}
    {
      "programs": ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      "instructionNames": ["route", "shared_accounts_route"],
      "accounts": {
        "include": ["So11111111111111111111111111111111111111112"],
        "roles": { "user_transfer_authority": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }
      },
      "includeFailed": false,
      "includeCpi": true
    }
    ```

    `accounts.roles`は、`user_transfer_authority`を命令中のウォレットの正確な位置に固定し、`accounts.include`だけよりも厳密です。単なるアドレスの一致では、命令の他の場所で無関係なアカウントとしてウォレットが現れることもあります。役割名は正確に一致するため、`describeProgram`の`roles`リストからコピーし、推測しないでください。`includeCpi: true`（デフォルト）はそのままにしておいてください。スワップの実際のトークン動きは内側の命令で発生します。
  </Step>

  <Step title="購読し、通知を処理する">
    フィルターを使って購読を開き、次に一致した命令のデコードされた引数を読みます。

    ```typescript theme={"system"}
    import WebSocket from "ws";

    const ws = new WebSocket("wss://<ENDPOINT>/?api-key=<API_KEY>");

    const filter = {
      programs: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      instructionNames: ["route", "shared_accounts_route"],
      accounts: {
        include: ["So11111111111111111111111111111111111111112"],
        roles: { user_transfer_authority: "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" },
      },
      includeFailed: false,
      includeCpi: true,
    };

    ws.on("open", () => {
      ws.send(JSON.stringify({
        jsonrpc: "2.0",
        id: 1,
        method: "parsedTransactionSubscribe",
        params: [filter, { commitment: "confirmed", details: "full" }],
      }));
    });

    ws.on("message", (data) => {
      const msg = JSON.parse(data.toString());
      if (msg.method === "parsedTransactionNotification") {
        const { transaction, instructions, matchedIndexes } = msg.params.result.value;
        for (const i of matchedIndexes) {
          const ix = instructions[i];
          if (!ix.decoded) continue;
          console.log(transaction.signature, ix.decoded.args.in_amount, ix.decoded.args.slippage_bps);
        }
      }
    });
    ```

    `matchedIndexes` に該当する指示にのみ注目し、トランザクション内の他のすべてはスキップします。読み取る前に `decoded` が存在することを確認してください。インデックスされていないプログラムバージョンのルート指示は、`decoded: null` と生のフィールドを伴って到着します。
  </Step>
</Steps>

## 次のステップ

<CardGroup cols={2}>
  <Card title="フィルターフィールドのリファレンス" icon="filter" href="/docs/ja/parsed-streams/quickstart#filter-fields">
    すべてのフィルターフィールド、オプション、および制限。
  </Card>

  <Card title="再接続の処理" icon="rotate" href="/docs/ja/parsed-streams/guides/handling-reconnects">
    切断やデプロイを超えて、この購読を生かし続けます。
  </Card>
</CardGroup>
