Краткое руководство
1
Get Access
Parsed Streams доступен на всех тарифных планах по цене 1 кредит за каждое доставленное событие. Получите ключ API в панели управления Helius и подключитесь к конечной точке Gatekeeper по адресу
wss://beta.helius-rpc.com — на том же хосте, который используется для трафика Helius RPC и WebSocket.Пройдите аутентификацию с помощью ключа API вашего проекта, передав его как параметр запроса api-key (или заголовок x-api-key).2
Connect
wscat
3
Subscribe with a Filter
Отправьте Поле
parsedTransactionSubscribe с фильтром и необязательными параметрами:result в ответе — это целочисленный идентификатор подписки:4
Read a Notification
Каждая соответствующая транзакция поступает как
parsedTransactionNotification уже в декодированном виде, а matchedIndexes указывает на инструкции, соответствующие вашему фильтру. Полную структуру см. в разделе «Уведомления».5
Unsubscribe
Руководства
Track Jupiter Swaps
Используйте
describeProgram, чтобы создать надежный фильтр перед оформлением подписки.Track Pump.fun Mints
Устойчивый к переподключениям обработчик, который регистрирует развертывание каждого нового токена Pump.fun.
Handling Reconnects
Обрабатывайте тайм-ауты бездействия и развертывания, а затем загружайте только пропущенные данные.
Справочник по протоколу
Parsed Streams использует JSON-RPC 2.0 через одно подключение WebSocket. На каждый запрос поступает ответ с тем жеid. Затем подписка отправляет сообщения parsedTransactionNotification, пока вы не отмените подписку или не отключитесь.
Подписка
ОтправьтеparsedTransactionSubscribe с фильтром и необязательными параметрами. Поле result в ответе — это целочисленный идентификатор подписки.
Request
Response
Поля фильтра
Необходимо указать хотя бы одно из полейprograms или accounts.include. Заданные поля объединяются оператором AND: для совпадения инструкция должна соответствовать каждому из них.
string[]
Идентификаторы программ для сопоставления (адреса base58, а не имена). Инструкция соответствует фильтру, если ее программа входит в этот список. Внутри списка применяется OR.
string[]
Имена декодированных инструкций, например
route. Сначала выполняется точное сопоставление, а затем — резервное сопоставление без учета регистра и разделителей, поэтому sharedAccountsRoute также соответствует имени shared_accounts_route в передаваемых данных. Внутри списка применяется OR. Соответствовать фильтру могут только инструкции, имя которых удалось определить по каталогу, поэтому берите имена из describeProgram.string[]
Адреса аккаунтов. Инструкция соответствует фильтру, если любой из этих адресов присутствует в ее списке аккаунтов. Внутри списка применяется OR. Работает для каждой инструкции независимо от того, декодирована она или нет. Сам идентификатор программы здесь не считается аккаунтом.
object
Сопоставление имени роли декодированного аккаунта с адресом, например
{ "user_transfer_authority": "<pubkey>" }. Каждая запись должна выполняться (между записями применяется AND), а для применения этого условия инструкция должна быть декодирована. Имена ролей сопоставляются точно, без изменения регистра, поэтому копируйте их из describeProgram, а не подбирайте самостоятельно.boolean
по умолчанию:"false"
Включать инструкции из неуспешных транзакций.
boolean
по умолчанию:"true"
Внутренние инструкции (CPI) могут соответствовать фильтру. Укажите
false, чтобы сопоставлять только инструкции верхнего уровня.-32602. Поэтому опечатки приводят к явной ошибке, а не к отсутствию совпадений.
Параметры
Второй параметр необязателен.string
по умолчанию:"confirmed"
Поддерживается только
confirmed.string
по умолчанию:"full"
Содержимое каждого уведомления.
full: вся транзакция, каждая инструкция и matchedIndexes, указывающий на совпадения с фильтром. matched: только совпавшие инструкции без списка индексов. raw: только совпавшие инструкции, каждая из которых сокращена до своей позиции, programId и блока data в формате base58, без декодированных полей и массива accountKeys. Используйте matched, если пропускная способность важнее контекста (полный объем данных в среднем примерно втрое больше), и raw, если вы самостоятельно декодируете данные инструкций и вам нужны только байты.Уведомления
Для каждой соответствующей транзакции отправляется одно уведомление на подписку. При значенииdetails: "full" по умолчанию:
transactionсодержит полный контекст. Значениеfeeуказано в лампортах.accountKeys— полный список ключей, включая ключи, загруженные из таблиц поиска адресов, в том же порядке, в котором их возвращает блокчейн. ЗначениеfeePayerвсегда равноaccountKeys[0]. Полеerrorсодержит ошибку транзакции в виде структурированного JSON, например{"InstructionError": [2, {"Custom": 6001}]}, когдаstatusравно"error".summaryимеет одинаковую структуру везде, где встречается:type(например,swapилиtransfer), понятное человеку полеdescriptionи структурированные данныеparsedData, когда синтаксический анализатор распознает действие. Для обмена это протокол, суммы и минты.transaction.summaryобозначает основное действие транзакции; каждая распознанная инструкция содержит собственное полеsummaryс той же структурой. Чтобы получить все обмены в транзакции, переберитеinstructionsи прочитайтеsummary.parsedDataтам, гдеsummary.typeравно"swap".- Суммы обмена сообщаются площадкой. Значения
in_amount,actual_out_amountи суммы внутренних обменов вparsedData— это значения, указанные площадкой, а не суммы, фактически отправленные или полученные кошельком пользователя. Они не учитывают комиссии за перевод Token-2022 и другие удержания, примененные вне обмена. Чтобы узнать точную полученную сумму, сравните балансы токен-аккаунта пользователя до и после транзакции. nativeTransfersиtokenTransfersсодержат движения SOL и токенов, извлеченные синтаксическим анализатором из всей транзакции, в той же структуре, которую возвращает Parsed Events API. Благодаря этому потребители потока и API могут использовать общий код обработки. Оба поля присутствуют всегда, но могут быть пустыми.instructionsсодержит все инструкции транзакции в порядке выполнения: за каждой инструкцией верхнего уровня следуют ее внутренние инструкции. Каждая запись содержит собственную позицию:instructionIndexуказывает, к какой инструкции верхнего уровня она относится (нумерация начинается с 0),innerInstructionIndex— ее позицию среди внутренних вызовов этой инструкции (nullозначает, что это сама инструкция верхнего уровня), аstackHeight— глубину вызова (1 для верхнего уровня). Используйте эти значения, а не позицию в массиве.matchedIndexesсодержит индексы элементовinstructions, которые фактически соответствуют вашему фильтру. Остальные элементы предоставляются для контекста. Приdetails: "matched"массив содержит только совпадения, аmatchedIndexesотсутствует.- Имена
decodedзаписываются в snake_case (in_amount,user_transfer_authority), как они опубликованы в IDL программы. Целочисленные аргументы часто представлены строками ("1000000"), поскольку значения u64 не помещаются в числовой тип JavaScript. blockTimeв настоящее время всегда равноnull. Не полагайтесь на это поле.- В одной транзакции может встречаться сочетание декодированных и недекодированных инструкций: полностью декодированный обмен может находиться рядом с нераспознанной заметкой. Выбирайте ветвь по
decoded: когда его значение равноnull, инструкция вместо этого содержитrawData(байты base58) иrawAccounts(обычный список публичных ключей), поэтому у вас всегда будут данные для обработки.
details: "raw" поле value сокращается до метаданных транзакции и блоков данных. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes и все декодированные поля отсутствуют (поле транзакции summary по-прежнему включено). Каждая совпавшая инструкция представлена своей позицией, программой и байтами data в формате base58 точно в том виде, в котором они находятся в блокчейне (они присутствуют даже для инструкций, которые можно было декодировать по каталогу):
Отмена подписки
true, если подписка существовала и принадлежала вам. Уведомления прекращаются немедленно. При закрытии подключения удаляются все его подписки.
Обнаружение
Самая распространенная ошибка при работе с API такого типа — допустимый фильтр, который ничего не находит, обычно из-за неверно подобранного имени инструкции или роли.describeProgram предотвращает это, возвращая точные имена, с которыми выполняется сопоставление. Сейчас этот метод доступен только в wss://fs-beta.helius-rpc.com/?api-key=<API_KEY>, поэтому отправляйте его через отдельное от подписок подключение:
Request
Response
jupiter, и поиск по имени может вернуть более старую запись). Если вы выполняете поиск по имени, убедитесь, что result.id — это программа, на которую вы хотите подписаться.
Рекомендуемый порядок действий: вызовите describeProgram, чтобы получить точные имена инструкций и ролей, создайте фильтр с этими именами, а затем оформите подписку. Полный процесс пошагово описан в руководстве «Отслеживание обменов Jupiter».
Ограничения
Ошибки
Ошибки соответствуют JSON-RPC 2.0:{ "error": { "code": <int>, "message": "<text>" }, "id": <id> }. В сообщениях точно указано, что и где пошло не так.
Подключения также могут закрываться с кодом закрытия WebSocket. Значение каждого кода и способы восстановления см. в руководстве «Обработка переподключений».