Mirise1/soltrail
GitHub: Mirise1/soltrail
一款通过 Bitquery 索引按日期和 USD 金额查找 Solana 历史原生 SOL 转账的 Python 命令行工具。
Stars: 2 | Forks: 0
# soltrail
利用 Bitquery 索引的 Solana 数据,查找接近目标 USD 价值的历史原生 SOL 转账。
你只需提供日期、美元金额和粗略的当地时间。它会根据当天的价格将美元目标转换为 SOL 范围,并返回匹配的原生转账,按其与目标的接近程度进行排名。它通过在狭窄的时间窗口内查询 Bitquery 的索引,而不是通过 RPC 爬取链上数据,因此一次查找仅需少数几次 API 调用。
## 工作原理
1. 使用历史 SOL/USD 价格(自动获取,或通过 `--sol-price-usd` 指定)将 USD 目标转换为 SOL 金额。
2. 围绕该金额构建一个 `±tolerance%`(容差百分比)的范围。
3. 依次尝试 `--timezone-offsets` 中的每个时区偏移量,并在返回准确匹配的第一个时间窗口时停止。
4. 每个时间窗口运行一次 Bitquery `transfers` 查询,由服务端根据时间和金额进行过滤。
5. 去重,仅保留普通的系统转账(见下文),根据与目标的偏差程度评分,并写入 JSON。
## 环境要求
- Python 3.10+
- 一个 Bitquery 访问令牌
获取令牌:
## 安装说明
```
cp .env.example .env # PowerShell: Copy-Item .env.example .env
```
在 `.env` 中设置 `BITQUERY_TOKEN`;其他所有配置均有默认值。你也可以选择安装以获取 `soltrail` 命令:
```
pip install -e . # then: soltrail --help
```
或者直接运行脚本,无需安装:
```
python scan_solana_bitquery.py --help
```
## 使用方法
```
# 使用来自 .env 的默认值
python scan_solana_bitquery.py
# 在 command line 上覆盖
python scan_solana_bitquery.py --date 2026-04-15 --target-usd 200 --max-results 10
# 特定的本地窗口和 timezone
python scan_solana_bitquery.py --date 2026-04-15 --target-usd 200 \
--local-window-start 11:45:26 --local-window-end 11:47:59 --timezone-offsets 3
# 不确定关于 timezone?依次尝试几个
python scan_solana_bitquery.py --date 2026-04-15 --target-usd 200 \
--local-window-start 11:46:07 --local-window-end 11:48:33 --timezone-offsets 0,3,5
```
添加 `-v` 以开启调试日志,或添加 `-q` 以仅显示警告。诊断信息会输出到 stderr;结果保存在 JSON 文件中。
## 选项
| 选项 | 描述 |
| --- | --- |
| `--date` | 格式为 `YYYY-MM-DD` 的 UTC 日期。 |
| `--target-usd` | 以 USD 为单位的目标转账价值。 |
| `--tolerance-pct` | 允许偏离目标价值的百分比。 |
| `--max-results` | 最多保存的匹配数量。 |
| `--query-limit` | 每个时间窗口请求的最大 Bitquery 转账行数。 |
| `--local-window-start` | 格式为 `HH:MM` 或 `HH:MM:SS` 的本地开始时间。 |
| `--local-window-end` | 格式为 `HH:MM` 或 `HH:MM:SS` 的本地结束时间。 |
| `--timezone-offsets` | 逗号分隔的待尝试 UTC 偏移量,例如 `0,3,5`。 |
| `--sol-price-usd` | 手动覆盖 SOL/USD 价格。 |
| `--include-non-pure-transfers` | 禁用严格的原生纯转账过滤器。 |
| `-v` / `-q` | 详细 / 安静日志模式。 |
运行 `python scan_solana_bitquery.py --help` 查看完整列表。大多数选项也可以通过 `.env` 中的 `SOLTRAIL_*` 键读取;但命令行参数具有更高优先级。
## 转账过滤器
默认情况下,扫描器仅保留简单的原生 SOL 系统转账,并丢弃任何看起来像 swap/AMM 管道操作的转账。它是根据同一次 `transfers` 查询已返回的字段来做出判断的——无需进行二次查询——仅当满足以下条件时才保留转账:
- 该指令是 System Program 的 `transfer`,
- 发送方同时也是签名者和手续费支付者,
- 没有内部指令(inner instructions),
- 账户数量和顶层指令数量均较少。
这会过滤掉大多数 Pump.fun、Raydium、Jupiter 及类似平台的转账。这是一种启发式方法,因此对于任何重要信息请务必亲自人工核对。使用 `--include-non-pure-transfers` 可查看原始候选项。
## 输出结果
结果将输出到 `matches__bitquery.json`。每条记录都包含签名、区块时间(UTC 时间和匹配到的时区时间)、SOL 金额、预估的 USD 价值、发送方/接收方、过滤器所使用的交易结构相关字段,以及接近度排名。
```
{
"date": "2026-04-15",
"sol_price_usd": 152.31,
"target_usd": 200.0,
"results": [
{
"signature": "5xEXAMPLE...signature",
"block_time": "2026-04-15T08:46:12Z",
"block_time_in_matched_timezone": "2026-04-15T11:46:12+03:00",
"amount_sol": 1.313110105,
"amount_usd_estimated": 200.01,
"usd_distance_abs": 0.01,
"source": "SenderPubkey...",
"destination": "ReceiverPubkey...",
"closeness_rank": 1,
"is_closest_match": true
}
]
}
```
## 成本说明
每个时区窗口对应一次 `transfers` 查询,并按顺序尝试直到有匹配结果为止——运气好的话,第一次猜测仅需一次调用。仅当默认时间窗口未能返回足够的高质量候选数据时才扩大 `--query-limit`;如果你已经知道具体时区,请精简 `--timezone-offsets`。
## 注意事项
Solana 交易数据是公开的,此工具仅读取这些数据——请在 Bitquery 的服务条款范围内,将其用于你自己的查询和研究。
标签:Python, Solana, 代码示例, 区块链, 数据分析, 无后门, 逆向工具, 链上数据