Как получить балансы и владельцев нескольких аккаунтов Solana одним запросом

При сверке балансов бывает важно знать, какая программа владеет каждым аккаунтом. Один вызов getMultipleAccounts возвращает оба поля для набора до 100 адресов с общим слотом контекста.

Сократите объём ответа

Отправьте этот JSON методом HTTP POST. В примере указаны адреса System Program и Vote Program. Нулевая длина dataSlice позволяет получить метаданные, пропустив содержимое буфера данных каждого аккаунта.

{"jsonrpc":"2.0","id":1,"method":"getMultipleAccounts","params":[["11111111111111111111111111111111","Vote111111111111111111111111111111111111111"],{"commitment":"finalized","encoding":"base64","dataSlice":{"offset":0,"length":0}}]}

Сопоставьте первый адрес с result.value[0], второй с result.value[1]. Для каждого найденного аккаунта сохраните lamports, owner и result.context.slot. В owner указана программа, которая управляет данными аккаунта. Чтобы узнать владельца токенов в токен-аккаунте, отдельно прочитайте и декодируйте его данные.

Сохраните позиции отсутствующих аккаунтов

Если для адресов A, B, C вернулся массив вида [object, null, object], аккаунт B отсутствовал в данном контексте. Если убрать null перед сопоставлением адресов, баланс C попадёт в строку B. Заведите в хранилище отдельное представление для отсутствующего аккаунта и числового нуля.

Сопоставьте результаты разных запросов

Для списка из 135 адресов понадобится как минимум два запроса. Запишите фактический слот каждого ответа. Во втором запросе minContextSlot позволяет задать нижнюю границу, равную слоту первого ответа. Узел может вернуть состояние более позднего слота, поэтому итоговая сумма по двум порциям может объединять состояния разных слотов.

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