НОВОЕ: Helius приобретает Light Protocol
Представляем фильтры tokenAccount для getTransactionsForAddress
Блог/Обновления

Представляем фильтры токен-аккаунтов для gTFA

СоосновательNick Pennie в XNick Pennie в LinkedIn
Чтение: 3 мин

В октябре прошлого года мы выпустили getTransactionsForAddress — новый RPC-вызов Solana для запросов к историческим данным, который объединяет getSignaturesForAddress и getTransaction в одном методе.

Сегодня мы рады сообщить, что getTransactionsForAddress (gTFA) теперь позволяет получить историю переводов токенов кошелька одним RPC-вызовом. 

Новая функция tokenAccounts позволяет включать транзакции связанных токен-аккаунтов кошелька. Ранее они не учитывались в gTFA и его предшественнике getSignaturesForAddress.

Раньше разработчикам приходилось вызывать getTokenAccountsByOwner, а затем getSignaturesForAddress для каждого токен-аккаунта. 

Это было медленно и дорого и часто требовало сотен дополнительных RPC-вызовов.

Теперь достаточно одного вызова getTransactionsForAddress с tokenAccounts.

Проблема

В Solana токены фактически не хранятся непосредственно в вашем кошельке.

Вместо этого кошельку принадлежат связанные токен-аккаунты (Associated Token Accounts, ATA), в которых и хранятся ваши токены. 

Например, когда кто-то отправляет вам USDC, токены поступают на ваш токен-аккаунт USDC, а не на основной адрес кошелька.

Из-за этого при запросе истории транзакций кошелька возникает серьезная проблема:

Когда вы вызываете getSignaturesForAddress для кошелька, то получаете только транзакции, которые напрямую ссылаются на адрес этого кошелька.

Переводы токенов, которые взаимодействуют с вашими токен-аккаунтами, но не упоминают кошелек, просто не отображаются.

Обходное решение

До сегодняшнего дня разработчикам приходилось применять громоздкое обходное решение:

  1. Вызвать getTokenAccountsByOwner, чтобы получить токен-аккаунты кошелька
  2. Вызвать getSignaturesForAddress для самого кошелька
  3. Вызвать getSignaturesForAddress для каждого токен-аккаунта
  4. Объединить все результаты
  5. Удалить дубликаты (многие транзакции затрагивают несколько аккаунтов)
  6. Отсортировать по времени

У этого подхода есть несколько недостатков:

1. Низкая производительность

Для кошелька с 50 токен-аккаунтами требуется не менее 51 RPC-вызова, чтобы составить полную историю. У профессиональных трейдеров, активных пользователей DeFi и любителей торговать мемкоинами могут быть сотни токен-аккаунтов.

2. Неэффективная пагинация

Хотите получить 20 последних транзакций? Нельзя просто получить по 20 транзакций из каждого источника и объединить их. Сначала нужно загрузить все данные, удалить дубликаты, отсортировать результаты и только затем выбрать первые 20 транзакций. 

Эффективная пагинация невозможна без избыточной загрузки данных.

3. Расходы на RPC быстро растут

Каждый RPC-вызов создает дополнительные издержки. Если на один пользовательский запрос приходится более 100 таких вызовов, затраты быстро растут, особенно при масштабировании.

Решение

С новым фильтром tokenAccounts вы можете получить полную историю кошелька одним RPC-запросом:

Код
{
    "jsonrpc": "2.0",
    "id": "helius-example",
    "method": "getTransactionsForAddress",
    "params": [
        "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
        {
            "filters": {
                "tokenAccounts": "all"
            },
            "sortOrder": "asc",
            "limit": 100
        }
    ]
}

Вот и всё. Один вызов. Полная история.

Параметры фильтрации

Фильтр tokenAccounts поддерживает три варианта: none, balanceChanged и all.

none (по умолчанию)

Если фильтр tokenAccounts установлен в none, транзакции должны ссылаться на адрес кошелька.

balanceChanged (рекомендуется)

При использовании balanceChanged транзакции должны ссылаться на адрес кошелька либо изменять баланс принадлежащего ему токен-аккаунта.

all

Если для tokenAccounts указано значение all, транзакции должны ссылаться на адрес кошелька или принадлежащего ему токен-аккаунта.

Варианты использования

Новая функция необходима для следующих решений:

  • Кошельки, отображающие полную историю транзакций
  • Трекеры портфелей, которым нужны данные о каждом перемещении токенов
  • Налоговое ПО, рассчитывающее прибыль и убытки по всем токенам
  • Аналитические панели, отображающие действия пользователей

Начало работы

Функция tokenAccounts уже доступна.

Просто добавьте tokenAccounts: balanceChanged (или all) в объект фильтров — и всё готово!

Еще не используете getTransactionsForAddress?

Ознакомьтесь с нашей документацией и SDK, чтобы узнать больше и начать работу.

Подпишитесь на Helius

Следите за новостями разработки на Solana и получайте уведомления о наших публикациях