> ## 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, примерах кода, параметрах запроса, структуре ответа и рекомендациях.

Метод RPC [`getTokenAccountsByDelegate`](https://www.helius.dev/docs/api-reference/rpc/http/gettokenaccountsbydelegate) получает все аккаунты SPL Token, которые назначили указанный публичный ключ делегатом. Делегат имеет полномочия выполнять определенные действия с аккаунтом токенов, например переводить или сжигать токены в пределах делегированной суммы.

Этот метод полезен для сервисов, которые управляют делегированными полномочиями или должны определить, от имени каких аккаунтов токенов может действовать определенный ключ.

## Распространенные сценарии использования

* **Получение списка делегированных активов:** Отображение всех аккаунтов токенов, для которых определенному кошельку или программе предоставлены полномочия делегата.
* **Автоматизированное управление токенами:** Сервисы, выполняющие действия от имени пользователей (например, автоматизированные маркет-мейкеры или протоколы стейкинга, управляющие токенизированными вознаграждениями), могут использовать этот метод для поиска аккаунтов, с которыми им разрешено взаимодействовать.
* **Аудит делегированных полномочий:** Проверка аккаунтов, которые делегировали полномочия определенному адресу.
* **Отзыв делегированных полномочий:** Определение аккаунтов токенов, у которых необходимо отозвать полномочия делегата (хотя сам отзыв выполняется отдельной транзакцией).

## Параметры запроса

1. **`delegatePubkey`** (строка, обязательный): Закодированный в base-58 публичный ключ аккаунта делегата, связанные аккаунты токенов которого необходимо найти.

2. **`filter`** (объект, обязательный): Объект JSON, в котором **необходимо** указать `mint` или `programId` для фильтрации аккаунтов:
   * **`mint`** (строка): Закодированный в base-58 публичный ключ определенного минтинга токена. Если он указан, запрос вернет только аккаунты этого типа токенов, делегированные `delegatePubkey`.
   * **`programId`** (строка): Закодированный в base-58 публичный ключ программы токенов, которая владеет аккаунтами. Обычно это стандартная программа SPL Token (`TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`) или программа Token-2022 (`TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`).

3. **`options`** (объект, необязательный): Необязательный объект конфигурации со следующими распространенными полями:
   * **`commitment`** (строка, необязательный): Задает [уровень подтверждения](https://www.helius.dev/blog/solana-commitment-levels).
   * **`encoding`** (строка, необязательный): Кодировка данных аккаунта. Настоятельно рекомендуется `"jsonParsed"`, поскольку эта кодировка возвращает сведения об аккаунте в удобочитаемом виде. Среди других вариантов — `"base64"` и `"base64+zstd"`. Если значение не указано, по умолчанию используется `"base64"`.
   * **`dataSlice`** (объект, необязательный): Позволяет получить только определенный фрагмент данных аккаунта. Содержит поля `offset` (usize) и `length` (usize). Применимо только для кодировок `base58`, `base64` или `base64+zstd`.
   * **`minContextSlot`** (u64, необязательный): Минимальный слот, на котором может быть обработан запрос.

## Структура ответа

Поле `result.value` в ответе JSON-RPC представляет собой массив объектов. Каждый объект представляет аккаунт токенов, для которого `delegatePubkey` является делегатом и который соответствует критериям `filter`. Каждый объект в массиве содержит два поля:

* **`pubkey`** (строка): Закодированный в base-58 публичный ключ самого аккаунта токенов.
* **`account`** (объект): Объект с подробной информацией об аккаунте токенов:
  * **`lamports`** (u64): Баланс аккаунта токенов в лампортах (для освобождения от арендной платы).
  * **`owner`** (строка): Публичный ключ программы, которой принадлежит этот аккаунт (например, программы токенов).
  * **`data`**: Данные аккаунта. Если используется кодировка `"jsonParsed"`, это будет объект с полем `program` (например, `"spl-token"`) и полем `parsed`, содержащим структурированные сведения:
    * **`parsed.info`**: Объект с такими сведениями, как:
      * **`mint`** (строка): Адрес минтинга токена.
      * **`owner`** (строка): Владелец аккаунта токенов (не делегат).
      * **`tokenAmount`** (объект): Общий баланс токенов на этом аккаунте (`amount`, `decimals`, `uiAmount`, `uiAmountString`).
      * **`delegate`** (строка): Публичный ключ делегата (должен совпадать с `delegatePubkey` из запроса).
      * **`delegatedAmount`** (объект): Количество токенов, которыми делегат уполномочен управлять (`amount`, `decimals`, `uiAmount`, `uiAmountString`).
      * **`isNative`** (логическое значение): Указывает, содержит ли аккаунт обернутые SOL.
      * **`state`** (строка): Состояние аккаунта токенов (например, `"initialized"`).
    * **`parsed.type`** (строка): Тип аккаунта (например, `"account"`).
  * **`executable`** (логическое значение): Является ли аккаунт исполняемым.
  * **`rentEpoch`** (u64): Эпоха, в которой с этого аккаунта в следующий раз потребуется арендная плата.
  * **`space`** (u64, если `jsonParsed` не используется): Длина необработанных данных аккаунта в байтах.

**Пример ответа (с кодировкой `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`. Без одного из этих фильтров нельзя запросить все делегированные аккаунты для всех типов токенов.
* **Кодировка:** Настоятельно рекомендуется использовать `"jsonParsed"` для параметра `encoding`. Это упрощает обработку данных, поскольку двоичные данные аккаунта декодируются в структурированный формат JSON.
* **Производительность:** Запрос с `programId` может потреблять больше ресурсов, чем запрос с `mint`, особенно если делегат имеет полномочия для множества различных типов токенов. Некоторые поставщики RPC могут устанавливать для этого метода более строгие ограничения частоты запросов.
* **Делегированная сумма:** Поле `delegatedAmount` в ответе указывает максимальное количество токенов, которое делегат в настоящее время уполномочен использовать. Оно может быть меньше общего значения `tokenAmount` на аккаунте.
* **Отзыв делегированных полномочий:** Этот метод только получает информацию. Чтобы отозвать делегированные полномочия, владелец аккаунта токенов должен отправить инструкцию `Revoke` программе SPL Token.

В этом руководстве представлен полный обзор использования `getTokenAccountsByDelegate` для поиска аккаунтов SPL Token по назначенному для них делегату.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.