快速入门
1
Get Access
Parsed Streams 适用于所有套餐,每交付一个事件消耗 1 个额度。从 Helius 控制面板获取你的 API 密钥,并连接到
wss://beta.helius-rpc.com 上的 Gatekeeper 端点。该端点与 Helius RPC 和 WebSocket 流量使用相同的主机。使用作为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]。当status为"error"时,error会以结构化 JSON 的形式携带交易错误,例如{"InstructionError": [2, {"Custom": 6001}]}。summary在所有出现位置都采用相同结构:一个type(例如swap或transfer)、一个便于阅读的description,以及解析器识别出操作时提供的结构化parsedData载荷——对于兑换,其中包含协议、数量和铸币地址。transaction.summary标记交易的主要操作;每条已识别的指令都有自己的summary,且结构相同。要收集一笔交易中的所有兑换,请遍历instructions,并读取summary.type为"swap"的summary.parsedData。- 兑换数量以交易场所报告的数据为准。
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 缩减为交易元信息和 blob。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 获取确切的指令和角色名称,使用这些名称构建过滤器,然后订阅。Track Jupiter Swaps 指南从头到尾进行演示。
限制
错误
错误遵循 JSON-RPC 2.0:{ "error": { "code": <int>, "message": "<text>" }, "id": <id> }。消息准确指出了问题所在。
连接也可以使用 WebSocket 关闭代码关闭——查看处理重连了解其含义和如何恢复。