28 lines
1.8 KiB
Markdown
28 lines
1.8 KiB
Markdown
# PumpSwap 低延迟 gRPC 示例
|
|
|
|
[English](README.md)
|
|
|
|
该示例通过 `solana-streamer-sdk` 监听 PumpSwap 买卖事件,并用事件中的成交后储备和动态费率构建一次跟随买入。交易客户端和 blockhash cache 会在订阅前初始化,事件热路径不会同步查询 blockhash。
|
|
|
|
## 运行
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
# 编辑 .env,然后载入当前 shell:
|
|
set -a; source .env; set +a
|
|
cargo run --release --package pumpswap_trading
|
|
```
|
|
|
|
也可以直接导出环境变量。`TARGET_MINT` 或 `TARGET_POOL` 至少设置一个;两者同时设置时必须都匹配。`MAX_EVENT_AGE_MS` 默认 1000。程序只读取环境变量,不会自行加载 `.env`。
|
|
|
|
## 交易语义
|
|
|
|
- 买入使用 `BuyAmount::WithMaxInput`,适合优先成交的跟单/狙击场景,滑点限制最大 quote 成本。
|
|
- 买入参数使用事件中的成交后储备和 LP/protocol/creator fee bps。
|
|
- 原始 quote 储备和虚拟 quote 储备均来自同一笔交易的事件快照;热路径不再查询 Pool 账户,避免额外延迟和跨 slot 混合报价。
|
|
- 第一个匹配事件用于异步记录买前余额,下一条新鲜事件才会交易,因此提交热路径不再查询余额;示例只卖出确认后的余额增量,并在卖出前重新获取池状态和 blockhash。
|
|
- 若业务必须精确花费 quote,应改用 `BuyAmount::ExactInput`。这会启用最小输出保护,在活跃池中更容易因状态变化而失败。
|
|
- 基线预热失败时会等待后续事件;一旦进入交易阶段,错误会保持单次执行锁定,因为提交状态或持仓可能不确定,必须先核对签名和账户状态再重试。
|
|
|
|
生产机器人还应增加持久化签名去重、持仓状态机、SWQoS 配置和有限次数的重新报价。不要通过把 `min_out` 设为零来处理滑点错误。
|