Skip to main content
Метод RPC 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 (строка, необязательный): Задает уровень подтверждения.
    • 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):

Примеры кода

Рекомендации разработчикам

  • Требование к фильтру: В параметре фильтра необходимо указать mint или programId. Без одного из этих фильтров нельзя запросить все делегированные аккаунты для всех типов токенов.
  • Кодировка: Настоятельно рекомендуется использовать "jsonParsed" для параметра encoding. Это упрощает обработку данных, поскольку двоичные данные аккаунта декодируются в структурированный формат JSON.
  • Производительность: Запрос с programId может потреблять больше ресурсов, чем запрос с mint, особенно если делегат имеет полномочия для множества различных типов токенов. Некоторые поставщики RPC могут устанавливать для этого метода более строгие ограничения частоты запросов.
  • Делегированная сумма: Поле delegatedAmount в ответе указывает максимальное количество токенов, которое делегат в настоящее время уполномочен использовать. Оно может быть меньше общего значения tokenAmount на аккаунте.
  • Отзыв делегированных полномочий: Этот метод только получает информацию. Чтобы отозвать делегированные полномочия, владелец аккаунта токенов должен отправить инструкцию Revoke программе SPL Token.
В этом руководстве представлен полный обзор использования getTokenAccountsByDelegate для поиска аккаунтов SPL Token по назначенному для них делегату.