Advanced Data Stream(高级数据流)
按池的流回答的是"这个代币发生了什么"。这条流回答的是"这笔交易里发生了什么",覆盖我们索引的每一个发射台上的每一笔交易。服务器发出 stream。随 Lite 和 Developer 提供:用你套餐的密钥连接。
用它做跟单、骗局过滤,以及任何需要整个市场而不是单个池的场景。如果你只关心少数几个代币,subscribe_trades 对你对我们都更省。
| 通道 | Socket.IO 事件 |
| 认证 | 握手中带上你套餐的密钥,auth: { api_key } |
| 发出 | stream |
| 套餐 | Lite(2 个 socket)和 Developer(5 个 socket) |
| 过滤 | 可选的 protocols 和 actions 列表 |
断线了?带 sinceSlot 重连,该 slot(槽位)之后的所有内容会先被发送;见回放与续传。想在这些交易执行之前就拿到它们,见 Ultra Fast Shred Stream(超快分片流)。
不带过滤订阅一次,整个市场就是你的:我们索引的每个发射台上的每一笔交易、发行、迁移和流动性变化,每笔交易一个事件。只想要其中一部分时,用 protocols 和 actions 收窄。
对比
示例
- JavaScript
- Python
import { io } from "socket.io-client";
const socket = io("https://sol.shrine.trade", { auth: { api_key: "sk_…" } });
// 全部,或者收窄:protocols 和/或 actions。
socket.emit("subscribe_stream", {
protocols: ["PUMPFUN", "PUMPSWAP", "STONKFUN"],
actions: ["buy", "sell", "create"],
});
socket.on("stream", (e) => {
if (e.action === "create" && (e.mintAuthority || e.freezeAuthority)) return; // 不是干净的发行
if (e.action === "buy") console.log(e.mint, e.tradersInvolved, e.quoteAmount, e.price);
});
// 之后要停止(免费):socket.emit("unsubscribe_stream");
import socketio
sio = socketio.Client()
sio.connect("https://sol.shrine.trade", auth={"api_key": "sk_…"})
sio.emit("subscribe_stream", {"actions": ["create", "migrate"]})
@sio.on("stream")
def on_stream(e):
print(e["action"], e["protocol"], e.get("mint"), e.get("tradersInvolved"))
sio.wait()
动作
action | 何时 | 协议 |
|---|---|---|
buy / sell | 任意 swap。每笔交易每个池一个事件;一笔交易里的多次 swap 会被聚合,并带逐笔的 breakdown。 | 所有发射台 |
create | 发射台铸币。 | PUMPFUN、PUMPFUN_MAYHEM、BONK、STONKFUN、METEORA_DBC |
createPool | 在已有代币上开设 AMM 池。 | PUMPSWAP、RAYDIUM、RAYDIUM_CLMM、METEORA、METEORA_DLMM、ORCA |
migrate | 曲线毕业进入其 AMM。 | PUMPFUN→PumpSwap,BONK 和 STONKFUN→Raydium,METEORA_DBC→DAMM v2 |
curveComplete | DBC 曲线已填满,尚未迁移。 | METEORA_DBC |
add / remove | 流动性的添加或撤出。 | PumpSwap、Raydium CPMM 和 AMM v4、DAMM v2、DLMM、Orca |
claimCreatorFees | 创建者领取手续费。 | PUMPFUN、PUMPSWAP |
负载
每个事件都带 signature、block、timestamp、action、protocol 和 txSigner(手续费支付者)。block 是 slot,timestamp 是链上该 slot 自己的时间,即 getBlockTime 对它返回的那一秒,所有发射平台都一样;同一 slot 里的两笔交易带同一秒。txSigner 不一定是交易者:机器人会经由中继器路由。做跟单请用 tradersInvolved。
交易
{
"signature": "…", "block": 445627693, "timestamp": 1788976012,
"action": "buy", "protocol": "PUMPFUN", "txSigner": "…",
"pool": "…", "mint": "…", "quoteMint": "So111…",
"tokenAmount": 31952.74, "quoteAmount": 0.0161, "price": 0.000000504,
"marketCapQuote": 504.1, "tokensInPool": 1041000000, "quoteInPool": 30.5,
"tradersInvolved": ["…"],
"breakdown": [
{ "trader": "…", "action": "buy", "tokenAmount": 31952.74, "quoteAmount": 0.0161, "price": 0.000000504 }
]
}
在发射台有报告的情况下,price 和池储备量是交易后的状态。marketCapQuote 是价格乘以供应量,以计价资产计。金额均为 UI 单位。
发行
{
"action": "create", "protocol": "PUMPFUN",
"mint": "…", "pool": "…", "quoteMint": "So111…", "creator": "…",
"name": "…", "symbol": "…", "uri": "…", "decimals": 6, "supply": 1000000000,
"tokensInPool": 1073000000, "quoteInPool": 30,
"initialBuy": { "quoteAmount": 0.5, "tokenAmount": 17000000 },
"mintAuthority": null, "freezeAuthority": null, "tokenExtensions": []
}
诚实的发行里 mintAuthority 和 freezeAuthority 都应为 null;有值意味着可以增发供应或冻结钱包。tokenExtensions 按名称列出 Token-2022 扩展;在可信发射台之外,transferFeeConfig 和 permanentDelegate 值得留意。initialBuy 是创建者在发行交易里自己的买入,没有则为 null。权限和扩展读自 mint 账户创建时的状态;如果 mint 早于这条流出现,它们可能缺失。
迁移与池
迁移带 fromPool、toPool 和 toProtocol。池创建带 pool、creator,以及已知时的 mint 和 quoteMint。流动性事件带 pool、owner 和两侧的原始金额(amountARaw、amountBRaw);哪一侧对应哪个 mint 遵循发射台自己的排序。
试一试
说明
- 请每个客户端只开一个连接。一切都按 socket 过滤,所以开一个 socket、订阅一次即可。
- 一笔交易的事件按固定顺序发出:先交易,再发行和池创建,再迁移和流动性,最后手续费领取。
- 这条流上的每个事件也会按小时归档供回测:见历史回放。
LimitsLite 2 socketsDeveloper 5 socketsSee plans →