Ultra Fast Shred Stream
这条链上的其他每一条数据流,包括我们自己的,都要等区块执行:节点运行交易、写下结果,数据流再把它传出去。Ultra Fast Shred Stream(超快分片流)不等。它在 shreds(分片)到达的那一刻直接从中读出交易,在区块运行之前就把每一笔 pump.fun 和 PumpSwap 交易发给你。
什么是 shreds
Solana 的区块不是作为一个整体传播的。leader 把它切成叫 shreds 的小数据包,一边构建区块一边发出,所以网络的其他部分在区块还在生成时就开始接收它。凑齐足够多的 shreds,你就拿到了区块里的交易,顺序正是 leader 排定的,而此时还没有任何节点执行过它们。这条流监听的正是这个。这是除 leader 之外任何人能看到一笔交易的最早时点。
为什么它携带的比高级数据流少
高级数据流描述的是一笔交易做了什么:成交的价格、收到的代币、付出的费用、留下的储备。shred 到达时这些都还不存在,因为什么都还没执行。Ultra Fast Shred Stream 只能告诉你一笔交易请求了什么:谁发的、哪个币、买还是卖、提交的金额。它发得更早,所以知道得更少。这就是交换条件,也正是全部意义所在:发射和意图是机器人据以行动的东西,结果是它用来记账的东西。
wss://sol.shrine.trade/api/ultrafast/stream?key=…
你能更早拿到什么
- 一次发射,连同它的 mint。 pump.fun 的
create在指令本身里就写明了 mint、联合曲线、创建者和元数据 URI。区块还不存在时你就握有 mint,一笔 Lightspeed 买入可以在同一瞬间发出。 - 每一笔买卖,按提交原样。 交易者、mint、请求的代币数和出价的 SOL。在 PumpSwap 上,还有池子和计价 mint。
- 包括回滚。 一笔将要失败的交易仍然是 leader 即将运行的交易;它在这条流上,而永远不会出现在已执行的流上。
它不能携带什么
任何只在执行之后才存在的东西:实际支付的 SOL、实际收到的代币、交易后的储备、费用、日志、余额或是否成功。高级数据流几毫秒后会带来这一切。两条都用:Ultra Fast Shred Stream 用来行动,已执行流用来记账。
领先多少
2026-10-08 在美国的一台机器上,通过公开的 socket,针对同一批交易实测:纽约地区的 Ultra Fast Shred Stream 在 98% 的 pump.fun 交易上最先拿到:比同地区我们自己的高级数据流早 6 ms,比从法兰克福服务所有客户的 pumpapi.io 早 16 ms,比 PumpPortal 的新代币流早约 115 ms。相对最好的已执行流,领先不大;相对其他所有流,领先很大;它买到的是事件的完整先后顺序,而不是固定的抢跑时间。
密钥
Ultra Fast Shred Stream 随 Developer 套餐提供,最多 3 个 socket。通过 ?key= 或 x-api-key 请求头传入你套餐的密钥。
不是 Developer 的密钥会在连接升级为 WebSocket 之前就被拒绝:缺少或未知的密钥得到 401,其他套餐的密钥得到 403 plan_required,该密钥已开着 3 个 socket 时得到 429 limit_exceeded。
数据流
wss://sol.shrine.trade/api/ultrafast/stream?key=…[&mints=…][&wallets=…][&creates=1][&all=1]
一条普通的 WebSocket,JSON 文本帧。在查询字符串里说明你要什么,或之后用消息更改;每次更改都由 subscribed 确认。
const ws = new WebSocket("wss://sol.shrine.trade/api/ultrafast/stream?key=…&creates=1");
ws.onmessage = (m) => {
const e = JSON.parse(m.data);
if (e.type === "create") {
console.log("launch", e.symbol, e.mint); // 区块还不存在时就拿到 mint
ws.send(JSON.stringify({ subscribe: [e.mint] })); // 并跟踪它的交易
}
if (e.type === "trade") console.log(e.side, e.mint, e.solAmount, "SOL", e.trader);
};
订阅
| 查询参数 | 消息 | |
|---|---|---|
mints=…,… | {"subscribe": [...]},{"unsubscribe": [...]} | 这些 mint 的交易(最多 500 个)。 |
wallets=…,… | {"subscribeWallets": [...]},{"unsubscribeWallets": [...]} | 这些钱包在 pump.fun 和 PumpSwap 上的所有动作。 |
creates=1 | {"creates": true} | 每一次发射。默认关闭。 |
all=1 | {"all": true} | 整条带子。 |
{"ping": true} | 回复 {"type": "pong"}。 |
connected 只来一次,带有数据流见到的最新 slot(槽位)以及当前生效的订阅。
事件
每个事件都带有 signature、slot、recv(从数据流取出时的挂钟时间,毫秒)、mint、trader 和 "preExecution": true。
create
{
"type": "create", "protocol": "PUMPFUN", "preExecution": true,
"signature": "3nQ…", "slot": 447483508, "recv": 1791325200123,
"mint": "…pump", "trader": "…",
"name": "…", "symbol": "…", "uri": "https://…",
"bondingCurve": "…", "creator": "…"
}
createV2: true 标记通过较新的 create 指令发起的发射。通常紧随其后、在同一笔交易里的开发者买入,会作为带 "createBuy": true 的 trade 到达。
trade
{
"type": "trade", "protocol": "PUMPFUN", "preExecution": true,
"signature": "5aP…", "slot": 447483509, "recv": 1791325200231,
"mint": "…pump", "trader": "…",
"side": "buy", "tokenAmount": 1250000000000, "solAmount": 0.5, "solLamports": 500000000,
"createBuy": false
}
金额是指令请求的数值,因为什么都还没执行:买入时,tokenAmount 是请求的代币数,solAmount 是交易者最多愿付的 SOL;卖出时,tokenAmount 是卖出的数量,solAmount 是最少接受的 SOL。PumpSwap 的交易则改为携带 pool、quoteMint、tokenAmount 和 quoteLamports(买入时为最大投入,卖出时为最小产出)。少数池以 SOL 或 USDC 为 base、以该币为 quote 创建,这类池的交易同样按该币的方向给出(mint 是该币,quoteMint 是 SOL 或 USDC);此时限额落在 tokenAmount 上(买入时为最少收到,卖出时为最多卖出),quoteLamports 为精确值。v3 的曲线交易(buy_v3、buy_exact_quote_in_v3、sell_v3)和其他 pump.fun 交易一样到达;清空曲线的 v3 买入会继续从迁移存入的代币里买,所以其执行总量可能多于曲线剩余。
多跳路由
PumpSwap 的 multi_hop_swap 在一条指令里经过多个池和曲线交易(与另一枚 pump 币配对的币,用 SOL 买入)。它按路由顺序,每一跳到达一个 trade:
{
"type": "trade", "protocol": "PUMPFUN", "preExecution": true,
"signature": "3b5…", "slot": 454824976, "recv": 1791538132004,
"mint": "3Tdp…Mpump", "trader": "…",
"side": "buy", "via": "multi_hop", "hop": 1, "hops": 2,
"bondingCurve": "…", "quoteMint": "56Zt…fpump",
"tokenAmount": null, "quoteLamports": null, "minAmountOut": 1
}
hop 从 0 起计;池的一跳 protocol 为 PUMPSWAP(带 pool),曲线的一跳为 PUMPFUN(带 bondingCurve);quoteMint 是这一跳的计价币。同一条路由的每一跳 side 相同。执行前只知道路由的输入:买入路由的第一跳带 quoteLamports(计价币是 SOL 时还带 solLamports),卖出路由的第一跳带 tokenAmount;其余金额都是上一跳的产出,为 null。minAmountOut 在最后一跳上。按 mint 过滤即可收到你那枚币的那一跳。
经由其他程序的交易
十笔 pump.fun 交易里有七笔不直接调用该程序:路由器、机器人自己的合约或聚合器在内部调用它。执行前没有内部指令可读,所以这样的交易只带交易本身透露的信息到达,标记为 "routed": true 并附 router 程序:
{
"type": "trade", "protocol": "PUMPFUN", "preExecution": true,
"signature": "2kq…", "slot": 455047120, "recv": 1791623412044,
"mint": "…pump", "trader": "…",
"routed": true, "router": "FLASHX8DrLbgeR8FcfNV1F5krxYcYMUdBkrP1EPBtxB9",
"bondingCurve": "…",
"side": null, "tokenAmount": null, "solAmount": null, "solLamports": null
}
币和交易者总是有的:曲线交易的 mint 是其联合曲线也在交易里的那个键(带 bondingCurve),PumpSwap 交易的 mint 是键里的那枚 pump 币(不带 pool)。当路由器把 pump.fun 指令原样放在自己的数据里时,side 和金额会被填上,否则为 null。经由其他程序的交易是细节更少的意图,不是另一种事件:像其他事件一样按 mint 或 trader 过滤即可。
连接消息
{"type": "lagged", "dropped": n} 表示你的客户端读得太慢,跳过了 n 个事件。{"type": "error", "message": …} 用于回应错误的消息。数据流会自行重连。
与 Lightspeed 搭配
这条流上的一个 create,加上一个带其 mint 的 Lightspeed 请求,是本 API 提供的从发射到买入落地的最短路径。跟单模式也一样:在这里跟踪一个钱包,在那里镜像它的买入。
LimitsDeveloper 3 socketsSee plans →