快速入门
1
获取访问权限
Parsed Streams 目前处于封闭测试阶段。Helius 团队会将您的项目 ID 加入白名单,并与您共享连接端点。要加入封闭测试,请在此申请。使用作为
api-key查询参数(或x-api-key头)的项目API密钥进行身份验证。2
连接
wscat
3
使用过滤器订阅
发送响应
parsedTransactionSubscribe,包含过滤器和可选选项:result是一个整数订阅ID:4
读取通知
每个匹配的交易作为已解码的
parsedTransactionNotification到达,具有指向您过滤器命中的指令的matchedIndexes。有关完整格式,请参见通知。5
取消订阅
指南
跟踪Jupiter交换
在订阅之前,使用
describeProgram构建您可以信任的过滤器。跟踪Pump.fun铸造
一个安全的重连监听器记录每一个新的Pump.fun代币部署。
处理重连
经受住空闲超时和部署,然后精准回填您错过的内容。
协议参考
解析流通过单个WebSocket连接使用JSON-RPC 2.0。每个请求都会收到具有相同id的响应。订阅然后推送parsedTransactionNotification消息,直到您取消订阅或断开连接。
订阅
发送parsedTransactionSubscribe 带有过滤器和可选选项。响应 result 是一个整数订阅ID。
Request
Response
过滤字段
至少需要programs 或 accounts.include 之一。您设置的字段与 AND 组合:指令必须满足所有条件才能匹配。
string[]
要匹配的程序 ID(base58 地址,而不是名称)。如果其程序在此列表中,则指令匹配。或在列表中。
string[]
解码的指令名称,如
route。首先精确匹配,然后不区分大小写和分隔符进行回退匹配,因此 sharedAccountsRoute 也匹配线路名称 shared_accounts_route。或在列表中。只有目录可以识别其名称的指令才能匹配,因此请从 describeProgram 获取名称。string[]
账户地址。如果在其账户列表中出现任何这些,则指令匹配。或在列表中。适用于每个指令,无论是否解码。程序 ID 本身在此不算作账户。
object
解码账户角色名称到地址的映射,例如
{ "user_transfer_authority": "<pubkey>" }。每个条目都必须成立(条目之间为且关系),并且指令必须解码才能适用。角色名称完全匹配,无大小写折叠,因此请从 describeProgram 复制而不是推测。boolean
默认值:"false"
包含失败交易的指令。
boolean
默认值:"true"
内部(CPI)指令有资格匹配。设置
false 仅匹配顶级指令。选项
第二个参数是可选的。string
默认值:"confirmed"
仅支持
confirmed。string
默认值:"full"
每个通知携带的内容。
full:完整交易,每个指令,以及指向过滤命中项的 matchedIndexes。matched:仅匹配的指令,无索引列表。raw:仅匹配的指令,每个指令简化为其位置,programId,以及 base58 data blob,无解码字段和无需 accountKeys 数组。当带宽比上下文更重要时,使用 matched(完整负载的平均大小大约是三个大小),当您自己解码指令数据且只需要字节时使用 raw。通知
每个匹配的交易每个订阅一个通知。默认情况下details: "full":
transaction是完整的上下文。fee是以 lamports 计。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"时。nativeTransfers和tokenTransfers列出了解析器从整个交易中提取的 SOL 和代币移动,形状与 Parsed Events API 返回的一样,因此流和 API 用户可以共享处理代码。两者始终存在,可能为空。instructions是每个执行顺序的交易指令:每个顶级指令后跟其内部指令。每个条目都有其自己的位置:topIndex属于哪个顶级指令(从 0 开始),innerIndex是其在该指令内部调用中的位置(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 缩减为交易元信息和 blob。accountKeys、nativeTransfers、tokenTransfers、matchedIndexes 以及所有解码字段都消失了(交易 summary 仍被包含);每个匹配的指令是其位置,其程序及其 data 字节在 base58 中,完全如链上所示(即使是目录可能已经解码的指令也是如此):
取消订阅
true。通知立即停止。关闭连接会移除其所有订阅。
发现
这种 API 最常见的失败是过滤器有效但没有匹配内容,通常是猜测的指令或角色名称。describeProgram 通过返回匹配器进行比较的确切名称来防止这种情况:
Request
Response
jupiter,并且名字查找可能解析到旧版本)。如果按名称查找,请确保 result.id 是您打算订阅的程序。
推荐流程:使用 describeProgram 获取确切的指令和角色名称,使用这些名称构建过滤器,然后订阅。Track Jupiter Swaps 指南从头到尾进行演示。
限制
错误
错误遵循 JSON-RPC 2.0:{ "error": { "code": <int>, "message": "<text>" }, "id": <id> }。消息准确指出了问题所在。
连接也可以使用 WebSocket 关闭代码关闭——查看处理重连了解其含义和如何恢复。