getTokenAccountsByOwner используется для получения всех токен-аккаунтов SPL, принадлежащих определенному публичному ключу. Это основной метод для кошельков и приложений, которым нужно отображать токены пользователя или взаимодействовать с его различными токен-аккаунтами.
Запрос необходимо отфильтровать либо по определенному mint токена, либо по programId (например, программе SPL Token или Token-2022).
Для кошельков с обширными портфелями токенов рекомендуется использовать getTokenAccountsByOwnerV2, который поддерживает пагинацию на основе курсора и настраиваемый размер страницы до 10 000 аккаунтов на запрос.
Распространенные сценарии использования
- Отображение портфеля пользователя: Получение всех токен-аккаунтов и, следовательно, их балансов для заданного адреса кошелька пользователя, чтобы отобразить полный портфель токенов.
- Логика приложения: Определение конкретного токен-аккаунта пользователя для определенного минта перед выполнением перевода или другого взаимодействия.
- Проверка: Проверка того, какими токен-аккаунтами для определенного типа токена владеет пользователь.
- Индексирование держателей токенов: Хотя этот способ менее эффективен для глобального индексирования, чем другие методы, его можно использовать для поиска аккаунтов известного набора владельцев.
Параметры запроса
-
ownerPubkey(строка, обязательный): Публичный ключ владельца аккаунта в кодировке base-58, токен-аккаунты которого необходимо получить. -
filter(объект, обязательный): Объект JSON, в котором необходимо указатьmintилиprogramId:mint(строка): Публичный ключ определенного минта токена в кодировке base-58. Если он указан, будут возвращены только принадлежащиеownerPubkeyтокен-аккаунты этого минта.programId(строка): Публичный ключ программы токенов, которая управляет аккаунтами, в кодировке base-58. Распространенные значения:- Программа SPL Token:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - Программа Token-2022:
TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
- Программа SPL Token:
-
options(объект, необязательный): Необязательный объект конфигурации, который может включать:commitment(строка, необязательный): Задает уровень подтверждения.encoding(строка, необязательный): Кодировка данных аккаунта. Настоятельно рекомендуется"jsonParsed". Другие варианты:"base64","base64+zstd". Значение по умолчанию —"base64".dataSlice(объект, необязательный): Позволяет получить определенный фрагмент данных аккаунта (offset: usize,length: usize). Только для кодировокbase58,base64илиbase64+zstd.minContextSlot(u64, необязательный): Минимальный слот для запроса.
Структура ответа
Полеresult.value в ответе JSON-RPC представляет собой массив объектов. Каждый объект соответствует токен-аккаунту SPL, который принадлежит ownerPubkey и соответствует filter.
Каждый объект в массиве value содержит:
pubkey(строка): Публичный ключ самого токен-аккаунта в кодировке base-58.account(объект): Подробная информация о токен-аккаунте:lamports(u64): Баланс в лампортах для освобождения от арендной платы.owner(строка): Программа-владелец (например, публичный ключ программы токенов).data: Данные аккаунта. Если используется кодировка"jsonParsed", это поле содержит:program(строка): например,"spl-token".parsed: Объект со структурированной информацией:info: Такие сведения, как:mint(строка): Адрес минта токена.owner(строка): Владелец токен-аккаунта (должен совпадать сownerPubkeyиз запроса).tokenAmount(объект): Баланс токенов (amount,decimals,uiAmount,uiAmountString).state(строка): Состояние токен-аккаунта (например,"initialized").isNative(логическое значение): Указывает, содержит ли аккаунт обернутые SOL.delegate(строка, необязательный): Адрес делегата, если он задан.delegatedAmount(объект, необязательный): Делегированная сумма, если задан делегат.
type(строка): например,"account".
executable(логическое значение): Является ли аккаунт исполняемым.rentEpoch(u64): Следующая эпоха, в которой необходимо внести арендную плату.space(u64, если неjsonParsed): Длина необработанных данных аккаунта в байтах.
jsonParsed и фильтрацией по programId):
Примеры кода
Рекомендации разработчикам
- Обязательный фильтр: В фильтре необходимо указать
mintилиprogramId. Без одного из этих основных фильтров невозможно запросить все токен-аккаунты владельца для всех типов токенов. - Ассоциированные токен-аккаунты: Этот метод возвращает все токен-аккаунты, принадлежащие публичному ключу, включая стандартные ассоциированные токен-аккаунты (ATA) и любые другие токен-аккаунты SPL, которыми он может владеть (например, созданные более старыми реализациями кошельков или пользовательскими конфигурациями).
- Кодировка: Для параметра
encodingнастоятельно рекомендуется использовать"jsonParsed". Эта кодировка преобразует двоичные данные аккаунта в более удобную структуру JSON. - Производительность: Если у владельца очень много токен-аккаунтов, особенно при фильтрации только по
programId, ответ может быть большим. В таких случаях используйтеgetTokenAccountsByOwnerV2, который имеет встроенную поддержку пагинации. - Token-2022 (расширения токенов): Если вы работаете с токенами, созданными с помощью программы Token-2022, которая поддерживает такие расширения, как комиссии за перевод, проценты и другие, используйте правильный
programId:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb.
getTokenAccountsByOwner и позволяет эффективно получать информацию о токен-аккаунтах для любого адреса Solana.
Пагинация для крупных портфелей токенов
Для кошельков с большим количеством токенов используйтеgetTokenAccountsByOwnerV2, который предоставляет:
- Пагинацию на основе курсора: задайте
limit(1–10 000) и используйтеpaginationKeyдля перехода между результатами - Инкрементальные обновления: используйте
changedSinceSlot, чтобы получить только токен-аккаунты, измененные после определенного слота - Повышенную производительность: предотвращает тайм-ауты и позволяет отслеживать портфель в реальном времени
- Поведение пагинации: окончание пагинации обозначается только отсутствием возвращенных токен-аккаунтов. Из-за фильтрации может быть возвращено меньше аккаунтов, чем задано лимитом. Продолжайте пагинацию, пока
paginationKeyне станет null
Связанные методы
getTokenAccountsByOwnerV2
Версия с пагинацией и навигацией на основе курсора для крупных портфелей
getTokenAccountBalance
Получение баланса определенного токен-аккаунта