Как сверить баланс SPL-токена по всем аккаунтам кошелька

Один токен Solana может храниться у кошелька на нескольких токен-аккаунтах. Если проверить только связанный токен-аккаунт (ATA), часть остатка может выпасть из отчёта.

Получите аккаунты конкретного токена

Подставьте два публичных адреса в base58 из одного кластера. Первый принадлежит владельцу токен-аккаунтов. Второй, адрес mint, однозначно определяет токен даже при совпадении тикеров у разных активов. Отправьте тело методом POST на HTTP RPC кластера.

{"jsonrpc":"2.0","id":1,"method":"getTokenAccountsByOwner","params":["WALLET_PUBLIC_KEY",{"mint":"TOKEN_MINT_PUBLIC_KEY"},{"commitment":"finalized","encoding":"jsonParsed"}]}

Для каждой записи в result.value сохраните pubkey и прочитайте account.data.parsed.info.tokenAmount. Пустой массив в успешном ответе означает, что в данном контексте подходящих аккаунтов не найдено. Если данные не удалось разобрать, сохраните ошибку или исходную запись, чтобы в отчёт не попал ложный ноль.

Сначала сложите целые единицы

Допустим, по двум аккаунтам обычного токена с шестью знаками после запятой пришли строки amount со значениями 1250000 и 40001. Преобразуйте их в целые числа произвольной точности. Получится 1290001 минимальная единица, или 1,290001 токена при выводе на экран. Сохраните исходную сумму, mint, точность и context.slot, чтобы другой обработчик мог воспроизвести расчёт.

Проверьте спорную строку

Вызовите getTokenAccountBalance с pubkey отдельного токен-аккаунта. Если более позднее чтение дало другой результат, сопоставьте слоты наблюдений. Между ними мог пройти перевод. Сумма в минимальных единицах показывает учтённый остаток. Заморозка аккаунта и расширения токена могут влиять на доступную к переводу сумму или отображаемое значение.

Документация Solana