# 签名与数据流 > Ora API 中少数需要你自己的钱包签名的流程,以及如何读取实时数据流。 ### 需要你签名的交易 大多数链上操作完全在 Ora 一侧执行,使用的是 Ora 为你的代币管理的钱包:发射、买入、卖出、清仓、销毁、锁定、策略和奖励领取。对于这些操作,你的脚本永远不会接触私钥。 少数流程会 *从你自己的钱包* 转出资金,因此它们会返回需要由该钱包签名的交易: | 流程 | 构建 | 然后 | |---|---|---| | 为发射注资 | `POST /engine/fund` | 签名并发送,然后调用 `POST /engine/fund/confirm` | | 取消发射 | `POST /engine/cancel` | 调用 `POST /engine/cancel/submit`,附上已签名的交易 | | 收取收益 | `POST /engine/collect` | 调用 `POST /engine/collect/submit`,附上已签名的交易 | | 购买老钱包 | `POST /portfolio/marketplace/quote` | 调用 `POST /portfolio/marketplace/buy`,附上已签名的存入交易 | 要以无人值守的方式运行这些流程,你的脚本需要该钱包的密钥。如果用的是你注册时创建的内嵌钱包,请改为在应用中签名。 ### 实时数据流 实时数据以 Server-Sent Events 的形式推送。浏览器的 `EventSource` 无法发送请求头,因此请在你的服务器、脚本或扩展中用 `fetch` 读取数据流: ```js title="stream.mjs" const res = await fetch(`https://api.useora.xyz/engine/tokens/${mint}/stream`, { headers: { Authorization: `Bearer ${process.env.ORA_API_KEY}`, Accept: 'text/event-stream' }, }); const reader = res.body.pipeThrough(new TextDecoderStream()).getReader(); let buf = ''; for (;;) { const { value, done } = await reader.read(); if (done) break; // reconnect with backoff buf += value; for (let i; (i = buf.indexOf('\n\n')) >= 0; buf = buf.slice(i + 2)) { const frame = buf.slice(0, i); // "event: …" and "data: {…}" lines console.log(frame); } } ``` 每个打开的数据流在你的[速率限制](https://docs.useora.xyz/developers/requests-and-errors/#rate-limits)中计为一个请求。 | 数据流 | 内容 | |---|---| | `/engine/tokens/{mint}/stream` | 在一个连接上获取一个代币的数据:先是一个 `snapshot`,随后是状态事件;先是 `trades_snapshot`,随后是每一笔 `trade`;还有已知的持有该代币的钱包,以及持有者统计。 | | `/user/tracked-wallets/trades/stream` | 你所追踪钱包的实时交易。 | | `/sol-usd/events` | SOL/USD 价格。 | | `/blockhash/events` | 最新的区块哈希和区块高度,大约每 220 毫秒一次。 | | `/jito/tip-lamports/events` | Jito 小费下限的各分位数。 | | `/jito/tip-accounts/events` | Jito 小费账户列表。 |