> ## 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.

# getTokenAccountsByDelegateの使用方法

> getTokenAccountsByDelegateの使用例、コード例、リクエストパラメータ、レスポンス構造、ヒントを学ぶ。

[`getTokenAccountsByDelegate`](https://www.helius.dev/docs/api-reference/rpc/http/gettokenaccountsbydelegate) RPCメソッドは、特定の公開鍵をデリゲートとして承認しているすべてのSPLトークンアカウントを取得します。デリゲートは、トークンアカウントでのトークンの転送やバーンといった特定のアクションを、委任された額まで実行する権限を持ちます。

このメソッドは、委任された権限を管理するサービスや、特定の鍵が代わりに操作できるトークンアカウントを発見する必要がある場合に便利です。

## 一般的な使用例

* **委任資産のリスト:** 特定のウォレットやプログラムがデリゲート権限を持つすべてのトークンアカウントを表示します。
* **自動トークン管理:** ユーザーの代わりにアクションを実行するサービス（例：自動マーケットメーカー、トークン化された報酬を管理するステーキングプロトコル）は、許可されたアカウントを見つけるために使用できます。
* **委任の監査:** 特定のアドレスにどのアカウントが委任権を持っているかを確認します。
* **委任の取り消し:** 委任権限を取り消す必要があるトークンアカウントを特定します（ただし、実際の取り消しは別のトランザクションです）。

## リクエストパラメータ

1. **`delegatePubkey`** (string, required): 関連するトークンアカウントを見つけたいデリゲートアカウントのベース58でエンコードされた公開鍵です。

2. **`filter`** (object, required): アカウントをフィルタリングするために`mint`または`programId`のいずれかを**必ず**指定する必要があるJSONオブジェクト:
   * **`mint`** (string): 特定のトークンミントのベース58でエンコードされた公開鍵です。指定した場合、この特定のトークンタイプのトークンアカウントのみが`delegatePubkey`に委任されているアカウントとして返されます。
   * **`programId`** (string): アカウントを所有するトークンプログラムのベース58でエンコードされた公開鍵です。通常は標準のSPLトークンプログラム(`TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`)またはトークン2022プログラム(`TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`)です。

3. **`options`** (object, optional): 次の一般的なフィールドを含むオプションの設定オブジェクト:
   * **`commitment`** (string, optional): [コミットメントレベル](https://www.helius.dev/blog/solana-commitment-levels)を指定します。
   * **`encoding`** (string, optional): アカウントデータのエンコーディングです。`"jsonParsed"`が非常に推奨され、人間が読めるアカウント情報を返します。他のオプションには`"base64"`、`"base64+zstd"`があります。指定されない場合はデフォルトで`"base64"`になります。
   * **`dataSlice`** (object, optional): アカウントデータの特定のスライスのみを取得できます。次のフィールドを含みます:`offset` (usize) と `length` (usize)。このオプションは`base58`、`base64`、または`base64+zstd`エンコーディングに対してのみ適用されます。
   * **`minContextSlot`** (u64, optional): リクエストが評価される最小スロットです。

## レスポンス構造

JSON-RPCレスポンスの`result.value`フィールドはオブジェクトの配列です。各オブジェクトは、`delegatePubkey`をデリゲートとして持ち、`filter`の基準に一致するトークンアカウントを表します。配列内の各オブジェクトには、次の2つのフィールドがあります:

* **`pubkey`** (string): トークンアカウント自体のベース58でエンコードされた公開鍵。
* **`account`** (object): トークンアカウントの詳細情報を含むオブジェクト:
  * **`lamports`** (u64): トークンアカウントのランプートバランス（家賃免除用）。
  * **`owner`** (string): このアカウントを所有するプログラムの公開鍵（例：トークンプログラム）。
  * **`data`**: アカウントデータ。`"jsonParsed"`エンコーディングが使用されている場合、これは`program`フィールド（例：`"spl-token"`）と`parsed`フィールドを含む構造化情報を持つオブジェクトとなります:
    * **`parsed.info`**: 詳細情報を含むオブジェクト:
      * **`mint`** (string): トークンのミントアドレス。
      * **`owner`** (string): トークンアカウントの所有者（デリゲートではありません）。
      * **`tokenAmount`** (object): このアカウント内のトークンの総残高（`amount`、`decimals`、`uiAmount`、`uiAmountString`）。
      * **`delegate`** (string): デリゲートの公開鍵（リクエストの`delegatePubkey`と一致する必要があります）。
      * **`delegatedAmount`** (object): デリゲートが管理する権限を持つトークンの量（`amount`、`decimals`、`uiAmount`、`uiAmountString`）。
      * **`isNative`** (boolean): アカウントがラップドSOLを保持しているかどうかを示します。
      * **`state`** (string): トークンアカウントの状態 (例: `"initialized"`)。
    * **`parsed.type`** (string): アカウントの種類 (例: `"account"`)。
  * **`executable`** (boolean): アカウントが実行可能かどうか。
  * **`rentEpoch`** (u64): このアカウントが次に家賃を要するエポック。
  * **`space`** (u64, if `jsonParsed` is not used): バイト単位での未加工のアカウントデータの長さ。

**例のレスポンス（`jsonParsed`エンコーディングを使用した場合）：**

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": {
    "context": {
      "slot": 183458000
    },
    "value": [
      {
        "pubkey": "SomeTokenAccountPubkey1...",
        "account": {
          "data": {
            "program": "spl-token",
            "parsed": {
              "info": {
                "delegate": "DelegatePubkeyProvidedInRequest...",
                "delegatedAmount": {
                  "amount": "1000000000",
                  "decimals": 9,
                  "uiAmount": 1.0,
                  "uiAmountString": "1.0"
                },
                "isNative": false,
                "mint": "TokenMintPubkey...",
                "owner": "ActualOwnerOfTheTokenAccount...",
                "state": "initialized",
                "tokenAmount": {
                  "amount": "5000000000",
                  "decimals": 9,
                  "uiAmount": 5.0,
                  "uiAmountString": "5.0"
                }
              },
              "type": "account"
            },
            "space": 165
          },
          "executable": false,
          "lamports": 2039280,
          "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", // SPL Token Program
          "rentEpoch": 382
        }
      }
      // ... potentially other token accounts delegated to the same delegate
    ]
  },
  "id": 1
}
```

## コード例

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <DELEGATE_PUBKEY> and <TOKEN_MINT_PUBKEY> or <TOKEN_PROGRAM_ID>
  # Example using programId (SPL Token Program)
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTokenAccountsByDelegate",
      "params": [
        "<DELEGATE_PUBKEY>",
        { "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
        { "encoding": "jsonParsed" }
      ]
    }' \
    <YOUR_RPC_URL>

  # Example using a specific mint
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTokenAccountsByDelegate",
      "params": [
        "<DELEGATE_PUBKEY>",
        { "mint": "<TOKEN_MINT_PUBKEY>" },
        { "encoding": "jsonParsed", "commitment": "confirmed" }
      ]
    }' \
    <YOUR_RPC_URL>
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function findDelegatedAccounts(delegateAddress, filter, encoding = 'jsonParsed') {
    // Replace with your RPC endpoint
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const delegatePubKey = new PublicKey(delegateAddress);

    try {
      let actualFilter;
      if (filter.mint) {
        actualFilter = { mint: new PublicKey(filter.mint) };
      } else if (filter.programId) {
        actualFilter = { programId: new PublicKey(filter.programId) };
      } else {
        console.error("Filter must contain either 'mint' or 'programId'");
        return;
      }

      const accounts = await connection.getTokenAccountsByDelegate(
        delegatePubKey,
        actualFilter,
        { encoding }
      );

      console.log(`Found ${accounts.value.length} token accounts delegated to ${delegateAddress}:`);
      accounts.value.forEach(accInfo => {
        console.log(`  Token Account: ${accInfo.pubkey.toBase58()}`);
        if (encoding === 'jsonParsed' && accInfo.account.data.parsed) {
          console.log(`    Mint: ${accInfo.account.data.parsed.info.mint}`);
          console.log(`    Owner: ${accInfo.account.data.parsed.info.owner}`);
          console.log(`    Delegated Amount: ${accInfo.account.data.parsed.info.delegatedAmount.uiAmountString}`);
        }
        // console.log(JSON.stringify(accInfo.account.data, null, 2)); // For full data
      });

    } catch (error) {
      console.error(`Error fetching token accounts by delegate for ${delegateAddress}:`, error);
    }
  }

  // Replace with an actual delegate public key
  const exampleDelegate = '4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T'; 

  // Example 1: Find all SPL Token program accounts delegated to `exampleDelegate`
  findDelegatedAccounts(exampleDelegate, { programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' });

  // Example 2: Find accounts for a specific mint (e.g., USDC) delegated to `exampleDelegate`
  // const usdcMint = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
  // findDelegatedAccounts(exampleDelegate, { mint: usdcMint });
  ```
</CodeGroup>

## 開発者向けヒント

* **フィルタ要件:** フィルターパラメータに`mint`または`programId`のいずれかを必ず指定してください。これらのフィルターなしでは、すべてのトークンタイプの委任アカウントを照会することはできません。
* **エンコーディング:** `encoding`オプションに`"jsonParsed"`を使用することを強くお勧めします。バイナリアカウントデータを構造化されたJSONフォーマットにデコードするため、データ処理が容易になります。
* **パフォーマンス:** `programId`を使用してクエリを実行すると、特にデリゲートが多くの異なるトークンタイプに権限を持つ場合、リソースがより集中的になる可能性があります。一部のRPCプロバイダーは、このメソッドに対してより厳しいレート制限を設けている場合があります。
* **委任量:** レスポンス内の`delegatedAmount`は、デリゲートが現在使用を許可されているトークンの最大数を示します。これは、アカウント内の総`tokenAmount`より少なくなる場合があります。
* **委任の取り消し:** このメソッドは情報を取得するだけです。委任を取り消すには、トークンアカウントの所有者がSPLトークンプログラムに`Revoke`命令を送信する必要があります。

このガイドは、承認されたデリゲートに基づいてSPLトークンアカウントを見つけるために`getTokenAccountsByDelegate`を使用する方法を包括的に解説しています。
