Skip to main content
В этом руководстве вы создадите панель, которая показывает активы любого адреса Solana и его текущую активность. Вы получите полный портфель токенов, NFT и SOL одним вызовом DAS, загрузите историю транзакций с помощью эксклюзивного для Helius метода getTransactionsForAddress и будете передавать новую активность в реальном времени через transactionSubscribe. Сначала вы опробуете встроенную демонстрацию, а затем создадите полноценное приложение Next.js.

Попробуйте в реальном времени

Вставьте свой API-ключ и адрес любого кошелька, чтобы увидеть совместную работу трех компонентов: портфеля, истории и ленты в реальном времени. Эти же данные будет отображать ваше приложение.

Создайте приложение на Next.js

Grab the full app on GitHub

Клонируйте полный стартовый проект — готовое приложение Next.js из этого руководства, которое можно сразу запустить с помощью npm install && npm run dev.
Приведенный выше виджет обращается к Helius непосредственно из браузера, из-за чего ваш API-ключ становится доступен клиенту. В реальном приложении ключ следует хранить на сервере. В этом руководстве используется App Router из Next.js с двумя обработчиками маршрутов, поэтому ваш ключ никогда не попадает на клиент: один перенаправляет вызовы RPC, а другой передает ленту WebSocket как события Server-Sent Events.
Предварительные требования: Node.js 18+ и API-ключ Helius.
1

Scaffold the project

Для вызовов RPC вы будете использовать Helius SDK, а для ленты WebSocket в реальном времени — ws.Добавьте свой ключ в .env.local:
.env.local
2

Proxy RPC calls through a route handler

Так API-ключ останется на сервере. Клиент отправляет сюда метод и параметры, а обработчик выполняет их через Helius SDK, который добавляет ваш ключ и формирует запрос.
app/api/helius/route.ts
3

Relay the live feed over Server-Sent Events

Браузер не может открыть подключение WebSocket к Helius без ключа. Вместо этого откройте WebSocket на сервере и передавайте подписи клиенту с помощью SSE.
app/api/stream/route.ts
4

Render the dashboard

Страница загружает портфель и историю через прокси, а затем подписывается на ленту SSE для получения обновлений в реальном времени.
app/page.tsx
5

Run it

Откройте http://localhost:3000, вставьте адрес кошелька и нажмите Load. Портфель и история появятся сразу, а лента в реальном времени будет пополняться по мере появления новых транзакций, затрагивающих кошелек.

Как это работает

Весь портфель одним вызовом DAS

getAssetsByOwner с showFungible: true и showNativeBalance: true возвращает взаимозаменяемые токены, NFT (как стандартные, так и сжатые) и нативный баланс SOL в одном ответе, поэтому отдельные вызовы getBalance или getTokenAccountsByOwner не нужны. Разделите items по interface, чтобы сгруппировать токены и NFT. Каждый элемент содержит собственные метаданные, поэтому один и тот же вызов формирует оба списка. Используйте content.metadata.name для имени, а content.links.image — для логотипа или изображения. Взаимозаменяемые токены также содержат объект token_info с исходными значениями balance, decimals и symbol. Разделите balance на 10 ** decimals, чтобы получить количество в удобочитаемом формате. Не у каждого токена есть имя или логотип, поэтому корректно обрабатывайте их отсутствие.

Полная история в одном запросе

getTransactionsForAddress возвращает историю транзакций кошелька, а с filters.tokenAccounts: "balanceChanged" также включает переводы по связанным токен-аккаунтам кошелька — активность, которую обычный вызов getSignaturesForAddress пропустил бы. Используйте transactionDetails: "full", чтобы получить полные данные транзакций, а не только подписи.

Обновления в реальном времени без опроса

transactionSubscribe отправляет сообщение каждый раз, когда транзакция затрагивает кошелек, поэтому опрос не требуется. Если добавить в фильтр tokenAccounts: "balanceChanged", он также будет сопоставлять токен-аккаунты кошелька, и входящие переводы SPL появятся в ленте — это та же активность, которую учитывает вызов истории. Передача подписки через серверный обработчик маршрута не позволяет API-ключу попасть на клиент.

Дальнейшие действия

getAssetsByOwner

Все параметры отображения, пагинация и полная структура ответа с активами.

getTransactionsForAddress

Расширенная фильтрация по времени, слоту, токену, направлению и сумме.

transactionSubscribe

Параметры фильтрации и структура полезной нагрузки для ленты WebSocket в реальном времени.

Deploy your own program

Следующий этап: разверните программу Solana в devnet через Helius.